【问题标题】:Serialization of collections AsReference in ProtoBuf-netProtoBuf-net 中集合 AsReference 的序列化
【发布时间】:2011-09-12 10:55:10
【问题描述】:

正如previous posts 中提到的,当一个对象列表(更大对象的成员)被标记为 AsReference 属性时,它的元素确实被序列化/反序列化为引用。然而 列表本身没有作为参考序列化。这种行为破坏了对象图的完整性。特别是,它与 MS BinaryFormatter 所做的不同。我想知道这个限制来自哪里,将它作为可选功能需要什么?

我评估将带有 SQL 状态会话的大型 ASP.NET 应用程序从 BinaryFormatter 迁移到 ProtoBuf-net 序列化以提高性能。该应用程序具有相当 复杂的数据模型全部保存在 Session 中,所以上面似乎是潜在的 bug。顺便问一下,您能回忆一下 BinaryFormmater 和 ProtoBuf.net 在行为上的其他显着差异吗?

【问题讨论】:

    标签: c# 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等)都有细微的差异 - 这没有什么不同
    • 我的意思是功能兼容性尽可能完整(可能通过可配置选项),使过渡变得容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多