Пример #1
0
        public void SupportsPolymorphism()
        {
            var binder = new KnownTypesSerializationBinder();

            binder.Register("envl", typeof(Envelope));
            binder.Register("base", typeof(Base));
            binder.Register("drvd", typeof(Derived));

            var settings = new JsonSerializerSettings {
                TypeNameHandling    = TypeNameHandling.All,
                SerializationBinder = binder,
            };

            string Serialize(Envelope e) => JsonConvert.SerializeObject(e, settings);
            Envelope Deserialize(string j) => JsonConvert.DeserializeObject <Envelope>(j, settings);

            var envelope = new Envelope {
                Data = new Derived {
                    Text = "derived", Value = 7
                }
            };

            var serialized   = Serialize(envelope);
            var deserialized = Deserialize(serialized);

            Assert.IsType <Derived>(deserialized.Data);
            Assert.Equal(7.0, ((Derived)deserialized.Data).Value);
            Assert.Equal(serialized, Serialize(deserialized));
        }
Пример #2
0
        public void KnownTypeHandlingSupportsPolymorphism()
        {
            var binder = new KnownTypesSerializationBinder();

            binder.Register("Envelope", typeof(Envelope));
            binder.Register("Base", typeof(Base));
            binder.Register("Derived", typeof(Derived));

            var settings = new JsonSerializerSettings {
                TypeNameHandling    = TypeNameHandling.All,
                SerializationBinder = binder,
            };

            string Serialize(Envelope e) => JsonConvert.SerializeObject(e, settings);
            Envelope Deserialize(string j) => JsonConvert.DeserializeObject <Envelope>(j, settings);

            var envelope = new Envelope {
                Data = new Derived {
                    Text = "derived", Value = 7
                }
            };

            var json = Serialize(envelope);

            Assert.Equal(json, Serialize(Deserialize(json)));
        }
Пример #3
0
        public void SameNameCannotBeRegisteredTwice()
        {
            var binder = new KnownTypesSerializationBinder();

            binder.Register("aname", typeof(Base));
            binder.Register("bname", typeof(Derived));

            Assert.Throws <ArgumentException>(() => binder.Register("bname", typeof(Other)));
        }
Пример #4
0
        public void FirstAttributeTakesPriority()
        {
            var binder = new KnownTypesSerializationBinder();

            binder.Register <ClassA>();
            binder.Register <ClassB>();

            TestSerialization(binder, "A0", new ClassA());
            TestDeserialization <ClassA>(binder, "A0");
            TestDeserialization <ClassA>(binder, "A1");
            TestDeserialization <ClassA>(binder, "A2");
        }
Пример #5
0
        public void AttributeCanBeUsedToRegister()
        {
            var binder = new KnownTypesSerializationBinder();

            binder.Register <ClassA>();
            binder.Register <ClassB>();

            TestSerialization(binder, "A0", new ClassA());
            TestDeserialization <ClassA>(binder, "A0");
            TestSerialization(binder, "B0", new ClassB());
            TestDeserialization <ClassB>(binder, "B0");
        }
Пример #6
0
        public void WithManyNamesFirstOneIsUsed()
        {
            var binder = new KnownTypesSerializationBinder();

            binder.Register("aname", typeof(Derived));
            binder.Register("bname", typeof(Derived));
            binder.Register("cname", typeof(Derived));

            TestDeserialization <Derived>(binder, "aname");
            TestDeserialization <Derived>(binder, "bname");
            TestDeserialization <Derived>(binder, "cname");

            TestSerialization(binder, "aname", new Derived());
        }
Пример #7
0
        public void CanRegisterSameTypeWithManyNames()
        {
            var binder = new KnownTypesSerializationBinder();

            binder.Register("aname", typeof(Base));
            binder.Register("bname", typeof(Derived));
            binder.Register("cname", typeof(Derived));

            TestDeserialization <Base>(binder, "aname");
            TestDeserialization <Derived>(binder, "bname");
            TestDeserialization <Derived>(binder, "cname");

            TestSerialization(binder, "aname", new Base());
            TestSerialization(binder, "bname", new Derived());
        }
Пример #8
0
        public void RegisterAssemblyRegistersAllAnnotatedTypes()
        {
            var binder = new KnownTypesSerializationBinder();

            binder.RegisterAssembly(GetType().GetTypeInfo().Assembly);

            TestSerialization(binder, "A0", new ClassA());
            TestDeserialization <ClassA>(binder, "A0");
            TestDeserialization <ClassA>(binder, "A1");
            TestDeserialization <ClassA>(binder, "A2");

            TestSerialization(binder, "B0", new ClassB());
            TestDeserialization <ClassB>(binder, "B0");

            var fallbackClassC =
                "K4os.Json.KnownTypes.Test.JsonKnownTypeAttributeTests+ClassC, " +
                "K4os.Json.KnownTypes.Test";

            TestSerialization(binder, fallbackClassC, new ClassC());
        }
Пример #9
0
        public void NameCanRedirectToDifferentType()
        {
            var binder1 = new KnownTypesSerializationBinder();

            binder1.Register("envl", typeof(Envelope));
            binder1.Register("base", typeof(Base));
            binder1.Register("drvd", typeof(Derived));

            var binder2 = new KnownTypesSerializationBinder();

            binder2.Register("envl", typeof(Envelope));
            binder2.Register("base", typeof(Base));
            binder2.Register("drvd", typeof(Other));

            var settings1 = new JsonSerializerSettings {
                TypeNameHandling    = TypeNameHandling.All,
                SerializationBinder = binder1,
            };
            var settings2 = new JsonSerializerSettings {
                TypeNameHandling    = TypeNameHandling.All,
                SerializationBinder = binder2,
            };

            string Serialize(Envelope e) => JsonConvert.SerializeObject(e, settings1);
            Envelope Deserialize(string j) => JsonConvert.DeserializeObject <Envelope>(j, settings2);

            var envelope = new Envelope {
                Data = new Derived {
                    Text = "derived", Value = 7
                }
            };
            var roundtrip = Deserialize(Serialize(envelope));

            Assert.True(roundtrip.Data is Other);
            Assert.Equal("derived", roundtrip.Data.Text);
            Assert.Equal(7.0, ((Other)roundtrip.Data).Value);
        }