2013-02-14 82 views
2

比方說,我們有以下三類:Protobuf網。反序列化基於

[ProtoContract] 
[ProtoInclude(10, typeof(FirstType))] 
[ProtoInclude(20, typeof(SecondType))] 
public class Base 
{ 
    [ProtoMember(1)] 
    public int ClassId {get;set;} 
} 

public class FirstClass : Base 
{ 
    ... 
} 

public class SecondClass : Base 
{ 
    ... 
} 

還有的類ID(基類)和匹配的子類的類型關係。例如,

var obj1 = new FirstClass() {ClassId = 1} 
var obj2 = new SecondClass() {ClassId = 2} 

現在讓我們假設我們已經序列化了這些對象。問題是:是否有任何好的方法通過查看ClassId字段來反序列化基於類Id值的序列化protobuf?即,如果seramed protobuf中classId的值爲1,則使用FirstClass對剩餘流字節進行反串行化。

謝謝!

回答

0

如果您使用的是ProtoInclude,那麼protobuf-net已經在考慮使用哪個子類:這是ProtoInclude的整個。在某些情況下,不可能使用繼承,在這種情況下,可以通過ProtoReader或通過使用只讀取該屬性的第二個模型來讀取原始數據流,然後重新設置源並再次讀取。這裏有一個例子:https://stackoverflow.com/a/14572685/23354

+0

感謝您的回答!還有一個問題:通過ProtoReader讀取原始數據流的方式非常有趣。這聽起來像我可以讓我自己的自定義轉換器(如Json.Net中的JsonConverter)在反序列化時使用。 在Protobuf-net中,有沒有辦法通過這樣的自定義轉換器,以便在解除對象的同時,可以使用自定義轉換器而不是默認的轉換器? – soleiljy 2013-02-15 01:10:45

+0

@soleiljy在此上下文中定義「自定義轉換器」? 「ProtoReader」和「ProtoWriter」是序列化程序在引擎蓋下使用的內容 - 但是,它們不是可定製的。只有一種閱讀基礎流的方法。如果你的意思是「我可以在ProtoReader之上編寫自己的引擎」 - 確定:玩得開心。這裏有一個自定義的'DataTable'序列化器的例子:https://code.google.com/p/protobuf-net/source/browse/trunk/DataTableSerializer – 2013-02-15 07:24:22