2011-06-08 31 views
1
[DataContract] 
    public class I<TId> 
    { 
    [DataMember(Order = 1)] 
    public TId Id { get; set; } 
    } 

    [DataContract] 
    public class J : I<int> 
    { 
    [DataMember(Order = 1)] 
    public string Description { get; set; } 
    } 

    class Program 
    { 
    static void Main() 
    { 
     var o = new J { Id = 5, Description = "xa-xa", }; 
     using (var ms = new MemoryStream()) 
     { 
     Serializer.Serialize(ms, o); 
     ms.Position = 0; 
     var o2 = Serializer.Deserialize<J>(ms); 
     Debug.Assert(o.Id == o2.Id); 
     } 
    } 
    } 

爲什麼斷言失敗以及如何解決它?最簡單的protobuf-net示例所需的幫助4

謝謝。

回答

1

它失敗了,因爲protobuf-net無法處理繼承,除非您通過屬性或運行時類型模型提供更多線索 - 實質上它需要從某處(即您)獲取字段編號。我很滿意地承認,在這種情況下,跟蹤警告可能是有用的,因爲它合理地爲清楚的是,這種繼承情況可能比J更多。

補充如下(在運行時)修復它:

RuntimeTypeModel.Default.Add(typeof(I<int>), true).AddSubType(2, typeof(J)); 

(的2唯一的意義存在,它不與I<int>定義的任何其他領域的衝突)。

+0

爲什麼需要這種消歧?我理解需要它的時候,被序列化的對象的靜態類型是基本類型之一,在這種情況下,反序列化器必須知道實例化哪個派生類型。但是在這裏,反序列化的類型是明確的,不是? – mark 2011-06-09 05:11:04

+0

@標記的重點不在*知道* - 它是在所有重要的字段編號上。字段號碼在protobuf(谷歌規範)中佔據着統治地位。我在這裏使用它們是「什麼是實際類型」分辨率的一部分 - 它是「我是」,「J」,「J」的某個子類還是「I」的某個非「J」子類「 – 2011-06-09 06:10:10