예제 #1
0
        private void DeserializeEnum(DeserializationStream stream, ref object propertyValue)
        {
            Type type      = stream.ReadType();
            var  converter = new EnumConverter();

            propertyValue = converter.DeserializeInto(stream, type);
        }
예제 #2
0
        public void ByteArrayWithLengthPrefixCanBeReaded()
        {
            // Arrange
            var data      = Encoding.UTF8.GetBytes("hello world");
            var size      = BitConverter.GetBytes(data.Length);
            var finalData = new List <byte>();

            foreach (byte b in size)
            {
                finalData.Add(b);
            }

            foreach (byte b in data)
            {
                finalData.Add(b);
            }

            // Act
            var stream = new DeserializationStream(finalData.ToArray());
            var result = stream.ReadBytesWithSizePrefix();

            // Assert
            result.Should().Equal(data);
            stream.Offset.Should().Be(finalData.Count);
        }
예제 #3
0
        public T Deserialize <T>(byte[] bytes)
        {
            var stream = new DeserializationStream(bytes);

            SerializedType deserializedType = stream.ReadSerializedType();

            if (deserializedType == SerializedType.Null)
            {
                return(default);
예제 #4
0
        public Enum DeserializeInto(DeserializationStream stream, Type type)
        {
            byte[] enumData = stream.ReadBytesWithSizePrefix();

            BinaryConverter converter       = new BinaryConverter();
            var             underlyingValue = converter.Deserialize <object>(enumData);

            return((Enum)Enum.ToObject(type, underlyingValue));
        }
예제 #5
0
        public void Ends_WhenItsEmpty()
        {
            // Arrange
            var data = new byte[0];

            // Act
            var stream = new DeserializationStream(data);

            // Assert
            stream.HasEnded.Should().BeTrue();
        }
예제 #6
0
        public void NotEnds_WhenOffsetIsSmallerThanData()
        {
            // Arrange
            var data = new byte[64];

            // Act
            var stream = new DeserializationStream(data, data.Length - 1);

            // Assert
            stream.HasEnded.Should().BeFalse();
        }
예제 #7
0
        public void Ends_WhenOffsetIsEqualStreamLength()
        {
            // Arrange
            var data = new byte[64];

            // Act
            var stream = new DeserializationStream(data, data.Length);

            // Assert
            stream.HasEnded.Should().BeTrue();
        }
예제 #8
0
        private void DeserializeObject <T>(DeserializationStream stream, ref T instance)
        {
            stream.ReadType();

            foreach (var field in instance.GetType().GetFieldsAccessibleForSerializer())
            {
                DeserializeField(field, ref instance, stream);
                if (stream.HasEnded)
                {
                    return;
                }
            }
        }
예제 #9
0
        public void ByteCanBeReaded(byte value)
        {
            // Arrange
            var data = BitConverter.GetBytes(value);

            // Act
            var stream = new DeserializationStream(data);
            var result = stream.ReadByte();

            // Assert
            result.Should().Be(value);
            stream.Offset.Should().Be(sizeof(byte));
        }
예제 #10
0
        public void ByteArrayWithoutLengthPrefixCanBeReaded()
        {
            // Arrange
            var data = Encoding.UTF8.GetBytes("hello world");

            // Act
            var stream = new DeserializationStream(data);
            var result = stream.ReadBytes(data.Length);

            // Assert
            result.Should().Equal(data);
            stream.Offset.Should().Be(data.Length);
        }
예제 #11
0
        public void OffsetCanBeChanged()
        {
            // Arrange
            var       data     = new byte[64];
            const int newIndex = 2;

            // Act
            var stream = new DeserializationStream(data);

            stream.SetOffset(newIndex);

            // Assert
            stream.Offset.Should().Be(newIndex);
        }
예제 #12
0
        protected override object DeserializeInternal(DeserializationStream stream, Type sourceType)
        {
            BinaryConverter converter = new BinaryConverter();

            byte[] keyData         = stream.ReadBytesWithSizePrefix();
            var    deserializedKey = converter.Deserialize <object>(keyData);

            byte[] valueData         = stream.ReadBytesWithSizePrefix();
            var    deserializedValue = converter.Deserialize <object>(valueData);

            var newKeyValuePair = Activator.CreateInstance(sourceType, deserializedKey, deserializedValue);

            return(newKeyValuePair);
        }
예제 #13
0
        protected override object DeserializeInternal(DeserializationStream stream, Type sourceType)
        {
            var instance = Activator.CreateInstance(sourceType);

            foreach (var field in sourceType.GetFieldsAccessibleForSerializer())
            {
                DeserializeField(field, ref instance, stream);
                if (stream.HasEnded)
                {
                    break;
                }
            }

            return(instance);
        }
예제 #14
0
        public void TypeCanReaded(string typeName, Type expectedType)
        {
            // arrange
            byte[] typeInfo  = Encoding.UTF8.GetBytes(typeName);
            byte[] sizeBytes = BitConverter.GetBytes(typeInfo.Length);
            byte[] data      = new byte[sizeBytes.Length + typeInfo.Length];
            Array.Copy(sizeBytes, 0, data, 0, sizeBytes.Length);
            Array.Copy(typeInfo, 0, data, sizeBytes.Length, typeInfo.Length);

            // Act
            var  stream = new DeserializationStream(data);
            Type type   = stream.ReadType();

            // Assert
            type.Should().Be(expectedType);
            stream.Offset.Should().Be(data.Length);
        }
예제 #15
0
        protected override Guid DeserializeInternal(DeserializationStream stream, Type sourceType)
        {
            byte[] guidData = stream.ReadBytesWithSizePrefix();

            return(new Guid(guidData));
        }
예제 #16
0
        protected override Enum DeserializeInternal(DeserializationStream stream, Type sourceType)
        {
            Enum result = DeserializeInto(stream, sourceType);

            return(result);
        }
예제 #17
0
 protected override decimal DeserializeInternal(DeserializationStream stream, Type sourceType)
 {
     return(stream.ReadDecimal());
 }
 protected override byte[] DeserializeInternal(DeserializationStream stream, Type sourceType)
 {
     return(stream.ReadBytesWithSizePrefix());
 }
예제 #19
0
 protected override float DeserializeInternal(DeserializationStream stream, Type sourceType)
 {
     return(stream.ReadFloat());
 }
        protected override DateTime DeserializeInternal(DeserializationStream stream, Type sourceType)
        {
            long ticks = stream.ReadLong();

            return(DateTime.FromBinary(ticks));
        }
예제 #21
0
 public override object Deserialize(DeserializationStream stream, Type type)
 {
     return(DeserializeInternal(stream, type));
 }
예제 #22
0
 protected override ulong DeserializeInternal(DeserializationStream stream, Type sourceType)
 {
     return(stream.ReadULong());
 }
        protected override BigInteger DeserializeInternal(DeserializationStream stream, Type sourceType)
        {
            byte[] bigIntegerData = stream.ReadBytesWithSizePrefix();

            return(new BigInteger(bigIntegerData));
        }
예제 #24
0
 protected override byte DeserializeInternal(DeserializationStream stream, Type sourceType)
 {
     return(stream.ReadByte());
 }
        protected override TimeSpan DeserializeInternal(DeserializationStream stream, Type sourceType)
        {
            long ticks = stream.ReadLong();

            return(TimeSpan.FromTicks(ticks));
        }
예제 #26
0
 public override object Deserialize(DeserializationStream stream)
 {
     return(Deserialize(stream, typeof(T)));
 }
        protected override object DeserializeInternal(DeserializationStream stream, Type sourceType)
        {
            Type collectionType = sourceType;

            if (collectionType == typeof(object))
            {
                collectionType = typeof(List <object>);
            }

            var         deserializedCollection             = Activator.CreateInstance(collectionType);
            bool        isDictionary                       = TypeHelper.IsDictionary(deserializedCollection);
            bool        isLinkedList                       = TypeHelper.IsLinkedList(deserializedCollection);
            IList       deserializedCollectionAsList       = null;
            IDictionary deserializedCollectionAsDictionary = null;

            if (isDictionary)
            {
                deserializedCollectionAsDictionary = (IDictionary)deserializedCollection;
            }
            else if (isLinkedList)
            {
                Type listType = typeof(List <>).MakeGenericType(sourceType.GenericTypeArguments);
                deserializedCollectionAsList = (IList)Activator.CreateInstance(listType);
            }
            else
            {
                deserializedCollectionAsList = (IList)deserializedCollection;
            }

            if (!stream.HasEnded)
            {
                BinaryConverter converter      = new BinaryConverter();
                int             sizeCollection = stream.ReadInt();

                for (int i = 0; i < sizeCollection; i++)
                {
                    int sizeData = stream.ReadInt();
                    if (sizeData == 0)
                    {
                        continue;
                    }
                    byte[] dataValue = stream.ReadBytes(sizeData);

                    MethodInfo method = typeof(BinaryConverter).GetRuntimeMethod("Deserialize", new[] { typeof(byte[]) });
                    if (sourceType.GenericTypeArguments.Length > 0)
                    {
                        if (isDictionary)
                        {
                            Type elementType = typeof(KeyValuePair <,>).MakeGenericType(sourceType.GenericTypeArguments);
                            method = method.MakeGenericMethod(elementType);
                        }
                        else
                        {
                            method = method.MakeGenericMethod(sourceType.GenericTypeArguments);
                        }
                    }
                    else
                    {
                        method = method.MakeGenericMethod(typeof(object));
                    }
                    var deserializeItem = method.Invoke(converter, new object[] { dataValue });

                    if (isDictionary)
                    {
                        KeyValuePair <object, object> keyValuePairFormObject = TypeHelper.CastFrom(deserializeItem);
                        deserializedCollectionAsDictionary.Add(keyValuePairFormObject.Key, keyValuePairFormObject.Value);
                    }
                    else
                    {
                        deserializedCollectionAsList.Add(deserializeItem);
                    }
                }
            }

            if (isLinkedList)
            {
                deserializedCollection = Activator.CreateInstance(collectionType, deserializedCollectionAsList);
            }

            return(deserializedCollection);
        }
예제 #28
0
 protected override object DeserializeInternal(DeserializationStream stream, Type sourceType)
 {
     return(null);
 }
예제 #29
0
 protected override string DeserializeInternal(DeserializationStream stream, Type sourceType)
 {
     return(stream.ReadUtf8WithSizePrefix());
 }
예제 #30
0
 protected abstract T DeserializeInternal(DeserializationStream stream, Type sourceType);