protobuf-net序列化对象图

时间:2011-06-09 14:19:03

标签: protocol-buffers protobuf-net

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

1 个答案:

答案 0 :(得分:19)

由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。反序列化时,两个地方都将使用相同的对象。