2012-07-13 67 views
1

我試圖使用protobuf-net並面臨以下問題。 我有兩個班。 protobuf-net和子類中的空屬性

[ProtoContract] 
class parent 
{ 
    [ProtoMember(1)] 
    public string name { get; set; } 
} 

[ProtoContract] 
class child : parent 
{ 
    [ProtoMember(2)] 
    public int num { get; set; } 
} 

如果我沒有設定孩子財產 「NUM」

var obj = new child() { name = "tester" }; 

創建一個子對象,並嘗試對其進行序列化

using (var stream = new MemoryStream()) 
{ 
    Serializer.NonGeneric.Serialize(stream, obj); 
} 

流將是空的。

有沒有辦法處理這種情況,而不使用父類的屬性[ProtoInclude]?
我正在使用protobuf-net v2 r480。

感謝

回答

1

正確的答案使用ProtoInclude來告訴它的子類。否則,它只是相對於「孩子」序列化,並且沒有任何有趣的數據(默認情況下,零不會被視爲有趣的數據),零長度的流是正確的序列化。 Protobuf不排除空的流。

如果你不能使用ProtoInclude,因爲在編譯時不知道類型,那麼你可以使用;

RuntimeTypeModel.Default[typeof(parent)] 
    .AddSubType(number, typeof(child)); 

需要注意的是「數字」 必須準確地重複以後,要不然也不會正確地反序列化。