Protocol buffers protobuf网络序列化对象图

Protocol buffers protobuf网络序列化对象图,protocol-buffers,protobuf-net,Protocol Buffers,Protobuf Net,如果对象A和B都包含一些字段序列化字段F,并且都指向同一个可序列化对象C。protobuf net是通过引用序列化还是通过值序列化?当对象图被反序列化时,protobuf net是否为A.F和B.F生成两个单独的对象?我问这个问题是因为我想知道序列化是否保持引用平等。原始的“protobuf”规范是由Google定义的,是一个树序列化程序(类似于XmlSerializer)。因此,默认情况下,C将被序列化两次,反序列化时会得到两个不同的对象 然而,这是一个常见的问题,在“v2”中,我将其作为选择

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

原始的“protobuf”规范是由Google定义的,是一个树序列化程序(类似于XmlSerializer)。因此,默认情况下,C将被序列化两次,反序列化时会得到两个不同的对象

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

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


这将序列化实例一次,在输出中生成唯一的id。当反序列化时,相同的对象将在两个位置使用。

Wow,我真的没想到会使用by-reference功能,因为考虑到PB的最初用途,我认为底层格式可能不支持它。这真是太棒了。不过,就像下面的问题一样,如果我通过引用序列化一个数组,那么该数组的每个元素是也通过引用序列化,还是仅通过顶级数组本身序列化?@jz87问得好。老实说,我需要检查一下,然后再回复您。看起来当前的protobuf net v2修订版445只支持类(或数组元素)引用相等。当序列化两个引用相等的集合时,反序列化后会得到两个不同的引用相等意义上的集合,但这些集合的所有元素都是引用相等的。请记住“AsReference=true”应出现在对对象的所有引用上,该对象应仅在1个副本中序列化,其中包括包含它的集合和导航属性。
[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 {...}