ProtoBuf-net中集合AsReference的序列化

时间:2011-09-12 10:55:10

标签: c# protobuf-net

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

我评估将具有SQL状态会话的巨大ASP.NET应用程序从BinaryFormatter迁移到ProtoBuf-net序列化以提高性能。该应用程序是公平的 复杂的数据模型都保存在Session中,所以上面似乎是一个潜在的bug。顺便问一下,你能回想起BinaryFormmater和ProtoBuf.net之间在行为方面的其他重大差异吗?

1 个答案:

答案 0 :(得分:2)

“需要什么”只是我花了几分钟来设计,实现(两次:运行时与元编程),单元测试(两次:运行时与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中是隐式的(自动)
  • 如果我看到模型
  • ,可能会发生一些其他事情