public void Serialize(object obj, BinaryDataWriter writer, IBaseline <TKey> baseline) { IBinaryObjectCollection <TKey> collections = (IBinaryObjectCollection <TKey>)obj; List <TKey> baseKeys = new List <TKey>(baseline.BaselineKeys); foreach (TKey key in collections.Keys) { BinaryDataWriter itemWriter = writer.TryWriteNode(_keySize); Baseline <byte> itemBaseline = baseline.GetOrCreateBaseline <Baseline <byte> >(key, _itemSerializer.Count, out bool isNew); _itemSerializer.Serialize(collections[key], itemWriter, itemBaseline); if (itemWriter.Length > 0 || isNew) { _writer.Write(writer, key); itemWriter.PushNode(); } baseKeys.Remove(key); } if (baseKeys.Count <= 0) { return; } _writer.Write(writer, _reservedKey); foreach (TKey key in baseKeys) { _writer.Write(writer, key); baseline.DestroyBaseline(key); } }
public void Update(object obj, BinaryDataReader reader) { IBinaryObjectCollection <TKey> collection = (IBinaryObjectCollection <TKey>)obj; while (reader.Position < reader.Length) { TKey key = _writer.Read(reader); if (_reservedKey.Equals(key)) { break; } using (BinaryDataReader itemReader = reader.ReadNode()) { if (!collection.TryGetValue(key, out object value)) { value = _itemCreator(); collection.Add(key, value); } _itemSerializer.Update(value, itemReader); } } while (reader.Position < reader.Length) { collection.Remove(_writer.Read(reader)); } }
public void Serialize(object obj, BinaryDataWriter writer) { IBinaryObjectCollection <TKey> collection = (IBinaryObjectCollection <TKey>)obj; foreach (TKey key in collection.Keys) { if (_reservedKey.Equals(key)) { throw new ArgumentException(); } BinaryDataWriter itemWriter = writer.TryWriteNode(_keySize); _itemSerializer.Serialize(collection[key], itemWriter); _writer.Write(writer, key); itemWriter.PushNode(); } }