protobuf-net 可以用来(反)序列化包含异构对象的列表吗?

Posted

技术标签:

【中文标题】protobuf-net 可以用来(反)序列化包含异构对象的列表吗?【英文标题】:Can protobuf-net be used to (de)serialize a list containing heterogeneous objects? 【发布时间】:2011-05-22 09:12:10 【问题描述】:

是否可以(反)序列化异构对象列表?

【问题讨论】:

(请不要直接向个人提问,即使是我;p) 【参考方案1】:

List<object>不包含类型元数据的序列化格式提出了许多挑战...但与往常一样,存在技巧、陷阱和变通方法。

如果您的意思是在最外层,这里有几个选项围绕使用不同的标签(/字段编号)来指示消息类型。这在 API(例如,套接字对话)上很有用,在该 API 中可能随时会收到不同的消息。例如:How can I send multiple types of objects across Protobuf?

消息内部有些棘手;如果候选类型的列表很小,那么一个合理的解决方法如下所示:Protobuf attributes with a hierarchy of generic classes,即将每个预期类型视为一个专业化。

如果无法预测类型,则 v2 包含另一种解决方法,但包含比正常情况更多的元数据;见http://marcgravell.blogspot.com/2011/03/objects-graphs-and-all-that-jazz.html

【讨论】:

好的,我明白了。我的第一个问题(可能会有更多问题)是否有可能在不实际接触基类型声明的情况下获得 ProtoInclude 效果。使用模型,可能?在 List 的情况下,我想在对象类型上使用 ProtoInclude,但显然我无法触及它的声明。 如果它真的是List<object>并且不能改变,那么属性或不;目前描述的最后一种方法是唯一可行的选择。但是,我建议使用更适合序列化的 DTO 堆栈。重新包含:是的,它们可以通过 RuntimeTypeModel 添加

以上是关于protobuf-net 可以用来(反)序列化包含异构对象的列表吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 protobuf-net,是不是可以在不分配内存的情况下反序列化消息?

Protobuf-net 对字节数组进行序列化/反序列化

需要在运行时确定哪些类型 protobuf-net 可以序列化/反序列化

是否可以在 Silverlight 中使用 protobuf-net 对私有属性进行(反)序列化?

我可以反序列化为 protobuf-net 中接口的只读属性吗?

带有枚举的 Protobuf-net 反序列化异常