public void DeserializerObjectTrackerShouldTrackNullObjects() { var tracker = new DeserializerObjectTracker(); tracker.TrackObject(3); Assert.Equal(1, tracker.NumberOfTrackedObjects); }
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); } }
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"); } }