2012-11-28 56 views
4

我有使用protobuf-net反序列化的問題。protobuf-net List <>繼承反序列化

我有以下類:

[ProtoContract] 
public class CrazyList : List<string> 
{ 
    [ProtoMember(1)] 
    private readonly string _foo; 

    public CrazyList(string foo) 
    { 
     _foo = foo; 
    } 

    public CrazyList(){} 

    public new void Add(string item) 
    { 
     Console.Write(item + foo); // Problem is here! 

     base.Add(item); 
    } 

} 

而且使用這樣的:

var list = new CrazyList("world!"); 
list.Add("Hello "); 

using (var ms = new MemoryStream()) 
{ 
    Serializer.Serialize(ms, list); 

    ms.Position = 0; 

    var listDS = Serializer.Deserialize<CrazyList>(ms); 
    listDS.Add("Goodbye "); 
} 

方法Add_foo領域反序列化之前燒製完成。

我該如何解決這個問題?

回答

1

你需要使用這個CrazList attribut;

[ProtoBuf.ProtoContract(IgnoreListHandling=true)] 
1

與XmlSerializer的,無論是東西是一個列表或葉。沒有「兩者」。目前,它會檢測「列表」,並且不會查找葉子成員。您可以將其更改爲葉子(請參閱Fredou的答案),但不會序列化這些項目。

由於電線規格(通過谷歌,而不是我)如何,列表本身的表示:重複序列只是:「項目,項目,項目,項目」。因此,如果某個列表中有某個地方我可以存儲與列表本身有關的數據。

坦率地說,最簡單的辦法是重構封裝,例如(是最小的爲簡潔起見):

class SomeWrapper { 
    string Foo ... 
    List<string> Items ... 
} 

可以,如果你還需要大概騙來,通過使用方法Fredou顯示,並補充說:

[ProtoMember(2)] 
private IList<string> Items { get { return this; } } 

這將使它看起來上面的小例子,不以任何方式顯著實際上改變模型。

順便說一句:不建議提供自定義添加一個List<T>子類,你不應依靠反序列化的順序。