/// <inheritdoc />
        public T Deserialize <T>(ReadOnlyMemory <byte> buffer)
        {
            T value = default(T);

            if (buffer.Length == 0)
            {
                return(value);
            }
            using (var ms = new MemoryReaderStream(buffer))
            {
                using (var sr = new StreamReader(ms))
                {
                    using (var jr = new JsonTextReader(sr))
                    {
                        var serializer = JsonSerializer.Create(EffectiveDeserializationSettings);

                        //use the following code block only for value types
                        //strangely enough Nullable<T> itself is a value type so we need to filter it out
                        if (typeof(T).GetTypeInfo().IsValueType&& (!typeof(T).GetTypeInfo().IsGenericType || typeof(T).GetGenericTypeDefinition() != typeof(Nullable <>)))
                        {
                            //we can't declare Nullable<T> because T is not restricted to struct in this method scope
                            object nullableVal = serializer.Deserialize(jr, typeof(Nullable <>).MakeGenericType(typeof(T)));
                            //either we have a null or an instance of Nullabte<T> that can be cast directly to T
                            value = nullableVal == null ? default(T) : (T)nullableVal;
                        }
                        else
                        {
                            value = serializer.Deserialize <T>(jr);
                        }
                    }
                }
            }
            return(value);
        }
Ejemplo n.º 2
0
        public void Seek_BeforeBeginning_ArgumentOutOfRange(int offset, SeekOrigin origin)
        {
            // Arrange

            var stream = new MemoryReaderStream(TestBytes.AsMemory());

            // Act/Assert

            Assert.Throws <ArgumentOutOfRangeException>(() => stream.Seek(offset, origin));
        }
Ejemplo n.º 3
0
        public void Seek_Offset_ExpectedPosition(int offset, SeekOrigin origin, int expectedPosition)
        {
            // Arrange

            var stream = new MemoryReaderStream(TestBytes.AsMemory());

            // Act

            stream.Seek(offset, origin);

            // Assert

            Assert.Equal(expectedPosition, stream.Position);
        }
Ejemplo n.º 4
0
        public void Seek_SuccessiveCurrent_CorrectPosition()
        {
            // Arrange

            var stream = new MemoryReaderStream(TestBytes.AsMemory());

            // Act

            stream.Seek(20, SeekOrigin.Current);
            stream.Seek(20, SeekOrigin.Current);
            stream.Seek(-5, SeekOrigin.Current);

            // Assert

            Assert.Equal(35, stream.Position);
        }
Ejemplo n.º 5
0
        public void Seek_AfterEnd_EmptyRead(int offset, SeekOrigin origin)
        {
            // Arrange

            var stream = new MemoryReaderStream(TestBytes.AsMemory());

            // Act

            stream.Seek(offset, origin);


            var actual    = new byte[1];
            var readBytes = stream.Read(actual, 0, actual.Length);

            // Assert

            Assert.Equal(0, readBytes);
        }
Ejemplo n.º 6
0
        public void Read_Span_AdvancesPosition(int position, int length, int expectedPosition)
        {
            // Arrange

            var stream = new MemoryReaderStream(TestBytes.AsMemory())
            {
                Position = position
            };

            // Act

            var actual = new byte[length];

            stream.Read(actual.AsSpan());

            // Assert

            Assert.Equal(expectedPosition, stream.Position);
        }
Ejemplo n.º 7
0
        public void Read_Span_ExpectedBytes(int position, byte[] expectedBytes)
        {
            // Arrange

            var stream = new MemoryReaderStream(TestBytes.AsMemory())
            {
                Position = position
            };

            // Act

            var actual    = new byte[8];
            var readBytes = stream.Read(actual.AsSpan());

            // Assert

            Assert.Equal(expectedBytes.Length, readBytes);
            Assert.Equal(expectedBytes, actual.Take(readBytes));
        }