为啥我的 List<Foo> 不能用 protobuf-net 序列化?

Posted

技术标签:

【中文标题】为啥我的 List<Foo> 不能用 protobuf-net 序列化?【英文标题】:Why won't my List<Foo> serialize with protobuf-net?为什么我的 List<Foo> 不能用 protobuf-net 序列化? 【发布时间】:2012-03-29 14:59:08 【问题描述】:
[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; 

然后,我在代码中设置了一个新的 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));

现在,我可以很好地序列化 Foo、Bar 和 Baz 的实例。如果我序列化

var listThatWorks = new List<Foo>  new Foo  FooId = 12  
var anotherListThatWorks = new List<Foo>  new Bar  FooId = 12, Name = "Test"  

效果很好。但是,如果我序列化

var fails = new List<Foo>  new Baz  FooId = 12, Name = "Test"  

然后我收到 InvalidOperationException 消息“意外的子类型:Baz”。我究竟做错了什么?在 protobuf-net 中使用子类型只是一个坏主意吗?

另外,感谢@BFree 帮助我弄清楚这与拥有两个级别的子类有关。

【问题讨论】:

相关问题:protobuf.net Unexpected subtype @M.Babcock - 我看到了。我相信最重要的回应是指旧版本的 protobuf-net(可能是错误的)。那,建议的答案不起作用。 我刚刚在一个简单的控制台应用程序中尝试了您的代码:pastie.org/3692350,它对我有用,没有例外...... @BFree - 哇,我可以把我的一些积分捐给你吗?谢谢你把它放在一起。结果我过度简化了我的例子,显然我的问题与两个级别的子分类有关。我要更新帖子了。 今晚可以看 - 现在不在 PC 上 【参考方案1】:

知道了。真的,我应该把功劳归功于 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));

我实际上并不确定订单值,但我知道这些是有效的。

【讨论】:

刚回来看这个 - 很高兴你把它整理好了。

以上是关于为啥我的 List<Foo> 不能用 protobuf-net 序列化?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能从 List<MyClass> 转换为 List<object>?

为啥jquery在我的html中不能用?

为啥不能在 vue 模板中使用窗口?

为啥数组不能分配给Iterable?

微信小程序为啥数组不能push

为啥我的组合框无法绑定到 ViewModel 中的 List<string>? WPF