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);
        }
Пример #2
0
        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);
        }
Пример #3
0
 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");
         }
     }
 }