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)); }
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); }