【问题标题】:protobuf-net serializing object graphprotobuf-net 序列化对象图
【发布时间】:2011-09-11 18:21:52
【问题描述】:

如果我的对象 A 和 B 都包含一些字段序列化字段 F,并且都指向同一个可序列化对象 C。protobuf-net 是按引用序列化还是按值序列化?反序列化对象图时,protobuf-net 是否为 A.F 和 B.F 生成 2 个单独的对象?我问是因为我想知道序列化是否保持引用相等。

【问题讨论】:

    标签: protocol-buffers protobuf-net


    【解决方案1】:

    由 Google 定义的原始“protobuf”规范是一个树序列化程序(如 XmlSerializer)。所以默认情况下你会得到 C 序列化两次,反序列化时会得到两个不同的对象。

    但是,这是一个非常常见的问题,因此在“v2”中,我将其作为选择加入的行为提供;请注意,您应该只将它用于 protobuf-net 到 protobuf-net,因为其他客户端不会期望这种配置(尽管它仍然是有效的 protobuf 流)。

    例如(使用属性,位也可以使用运行时模型):

    [ProtoContract]
    public class A {
        ...
        [ProtoMember(5, AsReference=true)]
        public C Foo {get;set;}
    }
    
    [ProtoContract]
    public class B {
        ...
        [ProtoMember(7, AsReference=true)]
        public C Bar {get;set;}
    }
    
    [ProtoContract]
    public class C {...}
    

    这将序列化实例一次,在输出中生成一个唯一的 id。反序列化后,两个地方都会使用同一个对象。

    【讨论】:

    • 哇,我真的没想到引用功能,因为考虑到 PB 的最初目的,我认为底层格式可能不支持它。这真是太棒了。
    • 不过,作为一个后续问题,如果我通过引用序列化一个数组,该数组的每个元素是否也通过引用序列化,或者只是顶级数组本身?
    • @jz87 好问题。老实说,我需要检查并回复您
    • 看起来当前的 protobuf-net v2 版本 445 只支持类(或数组元素)引用相等。当你序列化两个引用相等的集合时,反序列化后你会得到两个在引用相等意义上不同的集合,但是这些集合的所有元素都将是引用相等的。
    • 请记住,“AsReference = true”应该出现在对对象的所有引用上,该对象应该仅在 1 个副本中序列化 - 其中包括包含它的集合和导航属性。
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多