2010-08-06 74 views
2

我無法弄清楚如何獲得protobuf-net來序列化從列表< T>派生的對象。我嘗試添加ProtoInclude屬性,但收到一個ProtoBuf.ProtoException:ProtoIncludeAttribute的已知類型List`1必須是UserTypeCollection的直接子類。當我刪除ProtoInclude attrib時,它顯示數據沒有被序列化。我似乎無法在任何地方找到這種情況的任何例子。我將protobuf序列化添加爲我們的WS API的選項,並且需要保持與DataContractSerializer的兼容性。protobuf-net和從泛型集合派生

[CollectionDataContract(), ProtoContract(InferTagFromName = true)] 
[ProtoInclude(100, typeof(List<UserType>))] 
public class UserTypeCollection : List<UserType> 
{ ... } 

[DataContract(), ProtoContract(InferTagFromName = true)] 
public class UserType { ... } 
+0

什麼是您序列化的對象?列表?或一些外部物體? – 2010-08-06 21:43:11

回答

3

ProtoInclude用於表示類型,而不是基本類型(畢竟,基型是已知的)。另外,IList<T>處理應該很大程度上是隱含的;注意,「推斷...」等在列表的情況下做得很少,因爲列表是只是包含項目的序列。

對於下面,我假設你正在試圖序列化列表(作爲最頂層的對象):

我不是在此刻正確的機器上,但在釋放的dll,我會期望其經對象包裝列表會使其工作:

[DataContract] 
public class Foo { 
    private readonly UserTypeCollection items = new UserTypeCollection(); 
    [DataMember(Order=1)] 
    public UserTypeCollection Items {get{return items;}} 
} 

在「V2」我希望,這種情形中,從一開始的工作。我會試着在明天測試(當我有合適的機器時)。

另一個想法;子類化List<T>通常不是很有用,因爲這些方法都不是虛擬的。當然,由你決定。最後一點 - 在「v2」中,我們可以從外部描述模型,如果您想對序列化有更多的控制權,但不會影響類型本身。