【发布时间】:2011-09-11 18:21:52
【问题描述】:
如果我的对象 A 和 B 都包含一些字段序列化字段 F,并且都指向同一个可序列化对象 C。protobuf-net 是按引用序列化还是按值序列化?反序列化对象图时,protobuf-net 是否为 A.F 和 B.F 生成 2 个单独的对象?我问是因为我想知道序列化是否保持引用相等。
【问题讨论】:
标签: protocol-buffers protobuf-net
如果我的对象 A 和 B 都包含一些字段序列化字段 F,并且都指向同一个可序列化对象 C。protobuf-net 是按引用序列化还是按值序列化?反序列化对象图时,protobuf-net 是否为 A.F 和 B.F 生成 2 个单独的对象?我问是因为我想知道序列化是否保持引用相等。
【问题讨论】:
标签: protocol-buffers protobuf-net
由 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。反序列化后,两个地方都会使用同一个对象。
【讨论】: