[DataContract] public class Foo
{
[DataMember(Order = 1)] public int FooId { get; set; }
}
[DataContract] public class Bar : Foo
{
[DataMember(Order = 2)] public string Name { get; set; }
}
[DataContract] public class Baz : Bar
{
[DataMember(Order = 3)] public string BazName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后,在代码中我设置了一个新的TypeModel并添加了我的子类型
_ProtobufSerializer = TypeModel.Create();
_ProtobufSerializer.Add(typeof(Bar), true);
_ProtobufSerializer.Add(typeof(Baz), true);
var type = _ProtobufSerializer.Add(typeof(Foo), true);
type.AddSubType(100, typeof(Bar));
type.AddSubType(101, typeof(Baz));
Run Code Online (Sandbox Code Playgroud)
现在,我可以将Foo,Bar和Baz的实例序列化.如果我序列化
var listThatWorks = new List<Foo> { new Foo { FooId = 12 } }
var anotherListThatWorks = new List<Foo> { new Bar { FooId = 12, Name = "Test" } }
Run Code Online (Sandbox Code Playgroud)
这很好.但是,如果我序列化
var fails = new List<Foo> { new Baz { FooId = 12, Name = "Test" } }
Run Code Online (Sandbox Code Playgroud)
然后我得到一个InvalidOperationException,消息"Unexpected sub-type:Baz".我究竟做错了什么?使用protobuf-net的子类型是一个坏主意吗?
另外,感谢@BFree帮助我弄清楚这与两个级别的子类有关.
知道了。真的,我应该赞扬 BFree。他整理了一个可运行的示例应用程序,向我展示了我原来的帖子过于简化了。真正的问题是我的对象模型,其中 Baz 是 Bar 的子类,而 Bar 本身是 Foo 的子类。当我设置 TypeModel 时,我没有正确指定这个结构。本来应该:
_ProtobufSerializer = TypeModel.Create();
_ProtobufSerializer.Add(typeof(Baz), true);
var barType = _ProtobufSerializer.Add(typeof(Bar), true);
var fooType = _ProtobufSerializer.Add(typeof(Foo), true);
fooType.AddSubType(100, typeof(Bar));
barType .AddSubType(101, typeof(Baz));
Run Code Online (Sandbox Code Playgroud)
我实际上不确定订单值,但我知道这些工作。