在ProtoBuf

时间:2017-07-19 08:18:32

标签: c# serialization protocol-buffers protobuf-net

我正在从DataContractSerializer迁移,转而支持ProtoBuf。我们之前注意到的一件事是,使用DataContract的IsReference =true和XML序列化程序会产生巨大的影响。

我想知道是否有一些关于我们使用AsReferenceDefault = true的{​​{1}}会发生什么的参考。

对序列化/反序列化的速度有什么影响?对序列化的影响有哪些?

附带问题:对一个对象的所有引用是否必须具有IsReference = true,或者我是否必须具有主要对象(真正拥有该对象的那个,我期望将该对象序列化的位置) IsReference = false并且仍然只有一个相同对象的实例?

1 个答案:

答案 0 :(得分:1)

此标志更改了许多内容:

  • 序列化时,意味着对于以这种方式标记的每个对象,它需要检查参考查找以查看它是否已经看到它;这不应该特别慢,但这是需要进行的额外工作
  • 然后它需要编写一个额外的抽象层 - 本质上是一个包装器对象,它包含预先存在的对象id,或者新的对象id加上对象的有效负载(这被形成为NetObjectProxy来自{ {3}},对于好奇的 - 使用字段1(现有对象),或字段210(新对象)设置);每次引用也会占用一点空间(但比重复序列化对象的空间要小)
  • 对于其他实现来说,这个额外的层有点尴尬(但并非不可能);基本上核心protobuf API没有对象标识的概念,因此这是一个特定于库的添加;如果你只是使用protobuf-net,你应该没问题

至于如何在实际中加起来:它将取决于场景,我喜欢听你的发现。

您需要AsReference的地方:如果没有通过AsReferenceDefault指定,则需要在所有希望参考跟踪发生的成员上指定 >。检查在单个成员级别应用,基本上是表单(虽然这不是实际代码):

bool asRef = member.AsReferenceSpecified()
    ? member.AsReference : metaType.AsReferenceDefault;