public int doDeserializeFromByteArray(byte[] byteArray, int startIndex) throws IOException {
        int index = startIndex;

        this.cProperties = BitConverter.toInt16(byteArray, startIndex);
        index += 2;
        this.rgPrids = new PropertyID[this.cProperties];
        for (int i = 0; i < this.cProperties; i++) {
            PropertyID propertyID = new PropertyID();
            propertyID.doDeserializeFromByteArray(byteArray, index);
            this.rgPrids[i] = propertyID;
            index += 4;
        }
        this.rgData = new ArrayList<>();
        for (PropertyID propertyID : this.rgPrids) {
            IProperty property = null;
            switch (PropertyType.fromIntVal(propertyID.type)) {
                case NoData:
                case Bool:
                case ObjectID:
                case ContextID:
                case ObjectSpaceID:
                    property = new NoData();
                    break;
                case ArrayOfObjectIDs:
                case ArrayOfObjectSpaceIDs:
                case ArrayOfContextIDs:
                    property = new ArrayNumber();
                    break;
                case OneByteOfData:
                    property = new OneByteOfData();
                    break;
                case TwoBytesOfData:
                    property = new TwoBytesOfData();
                    break;
                case FourBytesOfData:
                    property = new FourBytesOfData();
                    break;
                case EightBytesOfData:
                    property = new EightBytesOfData();
                    break;
                case FourBytesOfLengthFollowedByData:
                    property = new PrtFourBytesOfLengthFollowedByData();
                    break;
                case ArrayOfPropertyValues:
                    property = new PrtArrayOfPropertyValues();
                    break;
                case PropertySet:
                    property = new PropertySet();
                    break;
                default:
                    break;
            }
            if (property != null) {
                int len = property.doDeserializeFromByteArray(byteArray, index);
                this.rgData.add(property);
                index += len;
            }
        }

        return index - startIndex;
    }
This method is used to deserialize the PropertySet from the specified byte array and start index.

@param byteArray  Specify the byte array.
@param startIndex Specify the start index from the byte array.
@return Return the length in byte of the PropertySet.
tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-microsoft-module/src/main/java/org/apache/tika/parser/microsoft/onenote/fsshttpb/streamobj/PropertySet.java