2011-06-09 52 views
15

如果我有對象A和B都包含一些字段序列化字段F,並且都指向相同的可序列化對象C.請問protobuf-net通過引用序列化或按值序列化?當對象圖被反序列化時,protobuf-net爲A.F和B.F產生2個獨立的對象嗎?我問,因爲我想知道序列化是否保留了參考平等。protobuf-net序列化對象圖

回答

17

由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。反序列化時,兩個地方都會使用同一個對象。

+1

哇,我真的沒有想到通過引用功能,因爲我認爲底層格式可能不支持它,給出了PB的原始目的。這真的很棒。 – jz87 2011-06-11 09:31:14

+2

就像後續問題一樣,如果我通過引用序列化一個數組,那麼該數組的每個元素是否都通過引用序列化或者只是頂級數組本身? – jz87 2011-06-11 09:39:26

+0

@ jz87很好的問題。我真的需要檢查並且得到你 – 2011-06-11 10:38:35