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