ProtoBuf-net 中集合 AsReference 的序列化
Posted
技术标签:
【中文标题】ProtoBuf-net 中集合 AsReference 的序列化【英文标题】:Serialization of collections AsReference in ProtoBuf-net 【发布时间】:2011-09-12 10:55:10 【问题描述】:正如previous posts 中提到的,当一个对象列表(更大对象的成员)被标记为 AsReference 属性时,它的元素确实被序列化/反序列化为引用。然而 列表本身没有作为参考序列化。这种行为破坏了对象图的完整性。特别是,它与 MS BinaryFormatter 所做的不同。我想知道这个限制来自哪里,将它作为可选功能需要什么?
我评估将带有 SQL 状态会话的大型 ASP.NET 应用程序从 BinaryFormatter 迁移到 ProtoBuf-net 序列化以提高性能。该应用程序具有相当 复杂的数据模型全部保存在 Session 中,所以上面似乎是潜在的 bug。顺便问一下,您能回忆一下 BinaryFormmater 和 ProtoBuf.net 在行为上的其他显着差异吗?
【问题讨论】:
【参考方案1】:“需要什么”只是我有几分钟的时间来设计、实现(两次:运行时 vs 元编程)、单元测试(两次:运行时 vs MP)、回归测试(两次... )、文档、部署等。这不是一个巨大的事情
一个实用的选项可能是封装列表,这样您就不需要直接引用该列表 - 即,而不是:
objA objB
> theList > theList
你可能有
objA objB listWrapper
> listWrapper > listWrapper > theList
这显然不是非常方便,但它会在今天工作。不过,对这种情况的支持已经在我的路线图上。
其他显着差异...这完全取决于您的状态模型是什么(在 任何一种情况下,我在这里推荐一个相当简单的 DTO 模型)。但是突然想到的事情:
它可能正在使用不同的构造函数(注意:您可以在 protobuf-net 中禁用构造函数的使用,作为一个选项) 根据您标记成员的方式,您可能在属性级别工作(BinaryFormatter 是字段级别;如果需要,protobuf-net也可以在字段级别工作) protobuf-net 对意外类型没有那么多支持(尽管 DynamicType 在某些情况下是一个选项); 通常它更愿意提前知道数据会是什么样子 protobuf-net 不序列化委托/事件(BinaryFormatter 可以) 引用跟踪在 protobuf-net 中是显式(选择加入),而在 BinaryFormatter 中是隐式(自动) 以及如果我看到模型可能会发生的其他一些事情【讨论】:
感谢您的全面回答。我敢肯定,尽可能与默认的 MS 二进制序列化完全兼容,将对这个项目的普及做出很大贡献。 @Shay 你的意思是输出中的 binary 兼容性吗?那行不通...如果您的意思是功能兼容性-由于协议,有些事情很棘手-就像每个序列化器(XmlSerializer、DataContractSerializer、javascriptSerializer等)都有细微的差异 - 这没有什么不同 我的意思是功能兼容性尽可能完整(可能通过可配置选项),使过渡变得容易。以上是关于ProtoBuf-net 中集合 AsReference 的序列化的主要内容,如果未能解决你的问题,请参考以下文章