【问题标题】:What is the performance impact of using AsReferenceDefault =true on ProtoBuf在 ProtoBuf 上使用 AsReferenceDefault =true 对性能有何影响
【发布时间】:2017-07-19 08:18:31
【问题描述】:

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

我想知道在某处是否有关于我们使用AsReferenceDefault = trueProtoContract 发生的事情的参考。

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

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

【问题讨论】:

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


    【解决方案1】:

    这个标志改变了很多东西:

    • 序列化的时候,意味着对于每一个这样标记的对象,都需要检查一个reference lookup,看是否已经看到了;这不应该特别慢,但这是需要进行的额外工作
    • 然后它需要编写一个额外的抽象层 - 本质上是一个包装对象,包括预先存在的对象 id 或新的对象 id 加上对象有效负载(这被塑造为来自 bcl.protoNetObjectProxy ,对于好奇的人 - 带有字段1(现有对象),或字段210(新对象);这也将占用每个引用的一点空间(但比重复序列化对象的空间更少)
    • 这个额外的层对于其他实现来说有点尴尬(但并非不可能);本质上,核心 protobuf API 没有对象标识的概念,因此这是特定于库的添加;如果你只是使用 protobuf-net 你应该没问题

    至于实际情况如何:这将取决于场景,我很想听听你的发现。

    在您需要 AsReference 的位置:如果未通过 AsReferenceDefault 指定,则需要在所有成员上指定它您希望参考跟踪发生的位置。检查应用于单个成员级别,主要是表单(尽管这不是实际代码):

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

    【讨论】:

    • 好的,谢谢,我会尝试测试(不确定如何看到差异)。有没有办法为整个序列化程序指定 AsReference ?另外,我感觉无论根节点标记为AsReferenceDefault,它都不会被相应地序列化。根据我的测试,它总是一个不同的参考。这是预期的行为吗?
    猜你喜欢
    • 1970-01-01
    • 2014-04-13
    • 2015-05-29
    • 2020-11-04
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2021-04-20
    相关资源
    最近更新 更多