public object Deserialize(BinaryReader reader, SerializationManager manager) { var listType = reader.ReadInt32(); var count = reader.ReadInt32(); ICollection <T> res; if (listType == 2) { res = new ObservableCollection <T>(); } else if (listType == 3) { res = new Collection <T>(); } else { res = new List <T>(); } for (var i = 0; i < count; i++) { res.Add((T)manager.Deserialize(reader)); } if (listType == 1) { return(res.ToArray()); } return(res); }
public object Deserialize(BinaryReader reader, SerializationManager manager) { var res = new TConcrete(); while (true) { var name = reader.ReadString(); if (string.IsNullOrEmpty(name)) { break; } var value = manager.Deserialize(reader); if (TargetProperties.TryGetValue(name, out var pi)) { pi.SetValue(res, value); } else if (value is IEnumerable enumerable && TargetCollectionProperties.TryGetValue(name, out pi)) { var collection = pi.GetValue(res); if (collection == null) { continue; } foreach (var i in value.GetType().GetInterfaces()) { if (i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable <>)) { var add = collection.GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy).Where(m => m.Name == "Add" && m.GetParameters() is ParameterInfo[] parameters && parameters.Length == 1 && parameters[0].ParameterType == i.GenericTypeArguments[0]).FirstOrDefault(); if (add == null) { continue; } var enumeratorMethod = i.GetMethod("GetEnumerator"); var enumerator = (IEnumerator)enumeratorMethod.Invoke(value, null); while (enumerator.MoveNext()) { add.Invoke(collection, new object[] { enumerator.Current }); } break; } } } } return(res); }
private void Receive(Stream stream) { using (var br = new BinaryReader(new WrapperStream(stream), Encoding.UTF8)) { var header = br.ReadInt32(); if (MagicHeader != header) { throw new InvalidOperationException("Unknown header"); } var version = br.ReadUInt16(); if (version == EnvelopeVersionV10) { ProcessEnvelope((Envelope)_serializationManager.Deserialize(br)); } else { throw new InvalidOperationException("Unknown envelope version"); } } }