public static bool Load([NotNull] this SerializedPropertyStorage obj, BinaryReader reader) { obj.StorageSize = reader.ReadInt32(); if (obj.StorageSize == 0) { return(true); } obj.Version = reader.ReadInt32(); obj.FormatID = reader.ReadGuid(); var ok = true; while (true) { // TODO // Error tolerance: // To be error tolerant, we will behave as if the binary sequence // was a string and we were to apply the following regex: // ^(ByName|ById)*$ // This means that we will backtrack to try to find alternatives. // At this moment what we have is: // - No backtracking // - Test by name, and if it fails, read by id var namedValue = new SerializedPropertyValueByName(); var ok2 = namedValue.Load(reader); SerializedPropertyValue value = namedValue; if (!ok2) { var identifiedValue = new SerializedPropertyValueById(); ok2 = identifiedValue.Load(reader); value = identifiedValue; } ok &= ok2; obj.SerializedPropertyValues.Add(value); if (value.ValueSize == 0) { break; } } return(ok); }
public static bool Load([NotNull] this SerializedPropertyValueByName obj, BinaryReader reader) { obj.ValueSize = reader.ReadInt32(); if (obj.ValueSize == 0) { return(true); } obj.NameSize = reader.ReadInt32(); obj.Reserved = reader.ReadByte(); var name = reader.ReadFixedSizeString(obj.NameSize, Encoding.Unicode, ZeroCharBehavior.None); var hasZeroAtEndOnly = name.IndexOf('\0') == name.Length - 1; obj.Name = name.TrimEnd('\0'); var remainingBytes = obj.ValueSize - 4 - 4 - 1 - obj.NameSize; obj.Value = reader.ReadBytes(remainingBytes); return(hasZeroAtEndOnly); }