Esempio n. 1
0
        public void SerializeInterfaceTest()
        {
            IUnionSample foo = new FooClass {
                XYZ = 9999
            };

            var bytes = JsonSerializer.Serialize(foo); // IUnionSample

            Assert.Throws <InvalidOperationException>(() => JsonSerializer.Deserialize <IUnionSample>(bytes));
            var newFoo = JsonSerializer.Deserialize <FooClass>(bytes);

            Assert.NotNull(newFoo);
            Assert.IsType <FooClass>(newFoo);
            // 已出错,XYZ按正常逻辑应为9999
            Assert.Equal(0, newFoo.XYZ);

            bytes  = Utf8JsonMessageFormatter.DefaultInstance.Serialize(foo);
            newFoo = Utf8JsonMessageFormatter.DefaultInstance.Deserialize <FooClass>(bytes);
            Assert.Equal(9999, newFoo.XYZ);

            bytes  = Utf8JsonMessageFormatter.DefaultInstance.SerializeObject(foo);
            newFoo = (FooClass)Utf8JsonMessageFormatter.DefaultInstance.Deserialize(typeof(FooClass), bytes);
            Assert.Equal(9999, newFoo.XYZ);
            newFoo = (FooClass)Utf8JsonMessageFormatter.DefaultInstance.Deserialize <IUnionSample>(typeof(FooClass), bytes);
            Assert.Equal(9999, newFoo.XYZ);

            Assert.Throws <InvalidOperationException>(() => Utf8JsonStandardResolver.Register(ImmutableCollectionResolver.Instance));
        }
Esempio n. 2
0
        public void SerializeInterfaceTest()
        {
            IUnionSample foo = new FooClass {
                XYZ = 9999
            };

            var bytes = MessagePackSerializer.Serialize(foo);
            // 实际开发中,是无法为接口配置所有实现类的 Union 特性的,虚拟基类也是如此
            var newfoo1 = MessagePackSerializer.Deserialize <IUnionSample>(bytes);

            Assert.NotNull(newfoo1);
            Assert.IsType <FooClass>(newfoo1);
            Assert.Equal(9999, ((FooClass)newfoo1).XYZ);
            // 实际应用中,无法确定消费者是按哪个类型(IUnionSample or FooClass)来反序列化的
            var newFoo = MessagePackSerializer.Deserialize <FooClass>(bytes);

            // 已出错,XYZ按正常逻辑应为9999
            Assert.Equal(0, newFoo.XYZ);

            bytes  = MessagePackMessageFormatter.DefaultInstance.Serialize(foo);
            newFoo = MessagePackMessageFormatter.DefaultInstance.Deserialize <FooClass>(bytes);
            Assert.Equal(9999, newFoo.XYZ);

            bytes  = MessagePackMessageFormatter.DefaultInstance.SerializeObject(foo);
            newFoo = (FooClass)MessagePackMessageFormatter.DefaultInstance.Deserialize(typeof(FooClass), bytes);
            Assert.Equal(9999, newFoo.XYZ);
            newFoo = (FooClass)MessagePackMessageFormatter.DefaultInstance.Deserialize <IUnionSample>(typeof(FooClass), bytes);
            Assert.Equal(9999, newFoo.XYZ);

            bytes  = TypelessMessagePackMessageFormatter.DefaultInstance.Serialize(foo);
            newFoo = TypelessMessagePackMessageFormatter.DefaultInstance.Deserialize <FooClass>(bytes);
            Assert.Equal(9999, newFoo.XYZ);

            bytes  = TypelessMessagePackMessageFormatter.DefaultInstance.SerializeObject(foo);
            newFoo = (FooClass)TypelessMessagePackMessageFormatter.DefaultInstance.Deserialize(typeof(FooClass), bytes);
            Assert.Equal(9999, newFoo.XYZ);
            newFoo = (FooClass)TypelessMessagePackMessageFormatter.DefaultInstance.Deserialize <IUnionSample>(typeof(FooClass), bytes);
            Assert.Equal(9999, newFoo.XYZ);

            var bar = new BarClass {
                OPQ = "t"
            };

            bytes = MessagePackSerializer.Serialize(bar, ContractlessStandardResolverAllowPrivate.Instance);
            var newBar = MessagePackSerializer.Deserialize <BarClass>(bytes, ContractlessStandardResolverAllowPrivate.Instance);

            Assert.Equal(bar.OPQ, newBar.OPQ);

            Assert.Throws <InvalidOperationException>(() => MessagePackStandardResolver.Register(ImmutableCollectionResolver.Instance));
        }