2011-06-28 98 views
1

我有序列化的基類。protobuf-net將基類反序列化爲繼承類

[ProtoContract] 
public class Web2PdfEntity 
{ 


     [ProtoMember(1)] 
     public string Title { get; set; } 
     [ProtoMember(2)] 
     public string CUrl { get; set; } 
} 

我想反序列化Web2PdfEntity類是從Web2PdfEntity繼承Web2PdfServer。

public class Web2PdfServer : Web2PdfEntity 
{ 

public void MyServerMethod {} 
public void MyServerMethod2{} 
} 

我試圖使用下面的代碼來反序列化類,不幸的是屬性沒有設置。

var web2Pdf = Serializer.Deserialize<Web2PdfServer>("c:\Web2PdfEntity-class-to-serialize-file.bin"); 
web2Pdf.Title //<- not deserialized 
web2Pdf.CURL //<- not deserialized 

回答

2

(重修訂)

基礎上的意見,提出的方案是:

  • 有兩種類型,其中發生是在C#中的子類
  • 系列化
  • ,我們只是想在它們之間平滑地交換 - 沒有繼承代碼(也就是說,您可以保存爲Web2PdfEntity並加載爲Web2PdfServer或vv)

這是對正常使用情況中,在那裏繼承的類型期望序列化期間繼承(其改變的數據)有一點不同,並且不相關的類型是可以互換的,只要該合同適合。

有幾種方法可以解決這個問題;一個小問題是默認它不看繼承的屬性,以避免重複。你可能重新做廣告,但這有點不好看。就個人而言,我覺得我會受到誘惑,只要告訴它的應用程序,在啓動過程中做什麼:

var metaType = RuntimeTypeModel.Default.Add(typeof(Web2PdfServer), false); 
metaType.Add(1, "Title").Add(2, "CUrl"); 

現在您現有的Serializer代碼將正確對待Web2PdfServer,其中包括兩個屬性所示。

+0

我無法在Web2PdfEntity類中添加[ProtoContract,ProtoInclude(8,typeof(Web2PdfServer))]]屬性,因爲Web2PdfEntity將在類庫(分離的程序集)中編譯,因爲安全原因將不包含Web2PdfServer類。是否有可能以其他方式解決問題? – Tomas

+0

@Marc,我試圖使用你的代碼,並嘗試反序列化類時發生錯誤System.InvalidCastException'發生在protobuf-net.dll中var web2Pdf = Serializer.Deserialize (「c:\ Web2PdfEntity-class-to-序列化-file.bin「); – Tomas

+0

@Tomas - 所寫的代碼應該沒問題;你的意思是「我用你的代碼減去屬性」?不能使用attribs,請參閱更新 –