gpt4 book ai didi

c# - 在 ProtoBuf 上使用 AsReferenceDefault =true 对性能有什么影响

转载 作者:太空宇宙 更新时间:2023-11-03 12:25:38 24 4
gpt4 key购买 nike

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

我想知道是否有关于我们使用 ProtoContractAsReferenceDefault = true 会发生什么的引用。

对序列化/反序列化的速度有什么影响?对序列化的内容有何影响?

附带问题:是否所有对一个对象的引用都必须具有 IsReference = true,或者我可以将主要对象(真正拥有该对象的对象,我希望将对象序列化的地方)与一个IsReference = false 并且仍然只有同一对象的一个​​实例?

最佳答案

这个标志改变了很多事情:

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

至于这在现实中如何加起来:这将取决于场景,我很想听听你的发现。

Re where you need AsReference:如果未通过 AsReferenceDefault 指定,则需要在所有成员上指定它,您希望引用跟踪到发生。检查在单个成员级别应用,主要采用以下形式(尽管这不是实际代码):

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

关于c# - 在 ProtoBuf 上使用 AsReferenceDefault =true 对性能有什么影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45184776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com