2012-02-11 86 views
2

我們使用protobuf-net(並且愛它!)。我們現在有一個從父級基類派生的protocontract-decorated子類,它不是protocontract裝飾的。Protobuf-net包含不可序列化基類的特定成員

我們試圖讓子類對一些父類的字段進行序列化/反序列化。

public abstract class TableServiceEntity 
{ 
    public virtual string PartitionKey { get; set; } 
    public virtual string RowKey { get; set; } 
    public DateTime Timestamp { get; set; } 
} 

[ProtoContract] 
public class IndicatorStreamIndex : TableServiceEntity 
{ 
    // protomember properties 
} 

我們如何獲得IndicatorStreamIndex來序列化/反序列化PartitionKey,RowKey和Timestamp?

最佳, 邁克

+0

稍後會試幾件事... – 2012-02-11 20:00:30

+0

Marc,謝謝!期待你的回覆。 – ionwarp 2012-02-11 23:33:40

+0

可以澄清:您使用的是哪個版本的protobuf-net?可用的不同功能,等 – 2012-02-12 14:41:13

回答

2

這可以在v2中很容易地進行配置,使用RuntimeTypeModel在運行時調整配置:

// this should only be done once per AppDomain, usually at app startup 
RuntimeTypeModel.Default.Add(typeof (IndicatorStreamIndex), true) 
    .Add("PartitionKey", "RowKey", "Timestamp"); 

// then when needed: 
var obj = new IndicatorStreamIndex 
{ 
    RowKey = "abc", 
    PartitionKey = "def", 
    Timestamp = DateTime.Today 
}; 
var clone = Serializer.DeepClone(obj); 
Console.WriteLine(clone.RowKey); // "abc" 
Console.WriteLine(clone.PartitionKey); // "def" 
Console.WriteLine(clone.Timestamp); // 13/02/2012 
+0

Marc,非常感謝!將很快實施,讓你知道它是如何發展的。 – ionwarp 2012-02-19 18:47:18

2

第一關 - 我認爲你有技術基礎上發展起來的優秀的串行器。也就是說,我發現ProtoBuf序列化的各個方面如此不切實際,以致於我無法看到自己在當前狀態下使用它。

讓我限定 - 首先,明確需要讓ProtoBuf屬性在類上進行序列化以強制ProtoBuf部署依賴;而序列化背後的基本思想之一就是可以採用相同的類,並且在需要/需要時將串行器(一個或多個)掃出 - 這意味着屬性和dll可能不需要用於不同的部署。

第二關 - 與ProtoBuf不默認遞歸繼承樹使它更具體Protobuf - 意味着更多的代碼混亂,更具體的代碼依賴等這是一個非常明顯的缺陷,在我看來,好像一個派生B從A開始,那麼當序列化B時,自然希望包含A的屬性 - 沒有上面線程中顯示的自定義代碼。

第三 - 自己想象一下,不需要屬性......然後你也可以畫出自己從對象序列化的例子, object []參數 - 哪個ProtoBuf當前不能執行。我猜想(不是我自己的序列化專家),它可能就像將類和程序集作爲序列化對象的一部分來遠程解析它一樣簡單 - 請記住,同一個庫也必須駐留在那裏。換句話說,基於遠程計算機上存在相同類型的名稱和程序集的假設,可以序列化任何類型/類型層次結構,而無需顯式屬性。

Marc,祝你好運。

Gawie

+0

我想我看着它錯誤的方式......回想起來,它可能更多的是一個跨語言交流工具,而不是一個.NET功能豐富的序列化sdk ... – user1210708 2012-10-08 18:07:49

相關問題