public void SerializationTests_Json_InnerTypes_TypeNameHandling() { var original = new RootType(); var str = JsonConvert.SerializeObject(original, JsonSerializationExample2.Settings); var jsonDeser = JsonConvert.DeserializeObject<RootType>(str, JsonSerializationExample2.Settings); // JsonConvert fully deserializes the object back into RootType and InnerType since we are using TypeNameHandling.All setting. Assert.Equal(typeof(InnerType), original.MyDictionary["obj1"].GetType()); Assert.Equal(typeof(InnerType), jsonDeser.MyDictionary["obj1"].GetType()); Assert.Equal(original, jsonDeser); // Orleans's SerializationManager also deserializes everything correctly, but it serializes it into its own binary format var orleansDeser = SerializationManager.RoundTripSerializationForTesting(original); Assert.Equal(typeof(InnerType), jsonDeser.MyDictionary["obj1"].GetType()); Assert.Equal(original, orleansDeser); }
public void SerializationTests_Json_InnerTypes_NoTypeNameHandling() { var original = new RootType(); var str = JsonConvert.SerializeObject(original); var jsonDeser = JsonConvert.DeserializeObject<RootType>(str); // Here we don't use TypeNameHandling.All setting, therefore the full type information is not preserved. // As a result JsonConvert leaves the inner types as JObjects after Deserialization. Assert.AreEqual(typeof(InnerType), original.MyDictionary["obj1"].GetType()); Assert.AreEqual(typeof(JObject), jsonDeser.MyDictionary["obj1"].GetType()); // The below Assert actualy fails since jsonDeser has JObjects instead of InnerTypes! // Assert.AreEqual(original, jsonDeser); // If we now take this half baked object: RootType at the root and JObject in the leaves // and pass it through .NET binary serializer it would fail on this object since JObject is not marked as [Serializable] // and therefore .NET binary serializer cannot serialize it. // If we now take this half baked object: RootType at the root and JObject in the leaves // and pass it through Orleans serializer it would work: // RootType will be serialized with Orleans custom serializer that will be generated since RootType is defined // in GrainInterfaces assembly and markled as [Serializable]. // JObject that is referenced from RootType will be serialized with JsonSerialization_Example2 below. var orleansJsonDeser = SerializationManager.RoundTripSerializationForTesting(jsonDeser); Assert.AreEqual(typeof(JObject), orleansJsonDeser.MyDictionary["obj1"].GetType()); // The below assert fails, but only since JObject does not correctly implement Equals. //Assert.AreEqual(jsonDeser, orleansJsonDeser); }