Esempio n. 1
0
        public void DeserializerObjectTrackerShouldTrackNullObjects()
        {
            var tracker = new DeserializerObjectTracker();

            tracker.TrackObject(3);
            Assert.Equal(1, tracker.NumberOfTrackedObjects);
        }
Esempio n. 2
0
        private static object Deserialize(byte[] bytes, SerializationOptions options, Type omittedRootType)
        {
            if (bytes == null || bytes.Length == 0)
            {
                return(null);
            }

            if (options.OmitRootTypeName &&
                omittedRootType == null)
            {
                throw new InvalidOmitRootTypeException("Omit root type name was set to true while its type was not provided for deserialization.");
            }

            using (var ms = new MemoryStream(bytes))
            {
                var tracker = new DeserializerObjectTracker();

                ValidateHeader(ms, tracker, options);

                TypeWithHashCode type;
                if (options.OmitRootTypeName)
                {
                    type = SerializedTypeResolver.GetTypeFromFullName(omittedRootType);
                }
                else
                {
                    var stringDeserializerMethod = (Func <Stream, DeserializerObjectTracker, string>)GetTypeDeserializer(typeof(string));

                    var typeName = stringDeserializerMethod(ms, tracker);
                    type = SerializedTypeResolver.GetTypeFromFullName(typeName);

                    if (type == null ||
                        type.Type == null)
                    {
                        throw new TypeNotFoundException("Unknown type: " + typeName);
                    }
                }

                var intDeserializerMethod = (Func <Stream, DeserializerObjectTracker, int>)GetTypeDeserializer(typeof(int));
                int hashCode = intDeserializerMethod(ms, tracker);
                if (hashCode != type.HashCode)
                {
                    throw new TypeWasModifiedSinceSerializationException(type);
                }

                Func <Stream, DeserializerObjectTracker, object> deserializerMethod = GetTypeToObjectDeserializer(type.Type);
                object value = deserializerMethod(ms, tracker);

                Debug.Assert(ms.Position == ms.Length, "Byte array was not read completely." + ms.Position + " / " + ms.Length);
                Debug.Assert(value != null, "unable to deserialize?");

                return(value);
            }
        }
Esempio n. 3
0
        private static void ValidateHeader(MemoryStream ms,
                                           DeserializerObjectTracker objTracker,
                                           SerializationOptions options)
        {
            var   int16Reader = (Func <Stream, DeserializerObjectTracker, short>)GetTypeDeserializer(typeof(short));
            var   byteReader  = (Func <Stream, DeserializerObjectTracker, byte>)GetTypeDeserializer(typeof(byte));
            short version     = int16Reader(ms, objTracker);
            byte  ort         = byteReader(ms, objTracker);

            if (version != InternalSerializationStuff.Version)
            {
                throw new InvalidSerializationVersionException(string.Format("Wrong serialization version. Was {0} and we expected {1}",
                                                                             version,
                                                                             InternalSerializationStuff.Version));
            }

            if (options.OmitRootTypeName && ort != 1)
            {
                throw new InvalidOmitRootTypeException("Omit root type name was set to true while the deserialization header has it set to false");
            }
        }