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)); }
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)); }