Exemplo n.º 1
0
        public T Deserialize(byte[] bytes)
        {
            var            stream           = new WorkingStream(bytes);
            SerializedType deserializedType = stream.ReadSerializedType();
            Type           sourceType       = deserializedType.GetBaseType();

            if (sourceType == null)
            {
                byte[] typeInfo = stream.ReadBytesWithSizePrefix();
                sourceType = TypeUtils.FromUTF8Bytes(typeInfo);
            }

            int offset = stream.Offset;

            return(ProcessDeserialize(bytes, sourceType, ref offset));
        }
Exemplo n.º 2
0
        public T Deserialize <T>(byte[] stream)
        {
            var workingStream = new WorkingStream(stream);

            SerializedType deserializedType = workingStream.ReadSerializedType();

            if (deserializedType == SerializedType.Null)
            {
                return(default(T));
            }

            Type sourceType = deserializedType.GetBaseType();

            if (sourceType == null)
            {
                byte[] typeInfo = workingStream.ReadBytesWithSizePrefix();
                sourceType = TypeUtils.FromUTF8Bytes(typeInfo);
            }

            BaseTypeConverter converter = ConvertersSelector.SelectConverter(sourceType);

            if (converter is IEnumerableConverter)
            {
                var preparedData = converter.DeserializeToObject(stream) as IEnumerable;
                if (preparedData is IList)
                {
                    var listType     = typeof(List <>);
                    var genericArgs  = sourceType.GenericTypeArguments;
                    var concreteType = listType.MakeGenericType(genericArgs);
                    var data         = Activator.CreateInstance(concreteType);
                    foreach (var item in preparedData)
                    {
                        ((IList)data).Add(item);
                    }
                    return((T)data);
                }
                else
                {
                    return((T)preparedData);
                }
            }

            return((T)converter.DeserializeToObject(stream));
        }
 internal static bool IsBaseType(this SerializedType serializedType)
 {
     return(serializedType.GetBaseType() != null);
 }