簡體   English   中英

protobuf-net List <>繼承反序列化

[英]protobuf-net List<> inheritance deserialization

我在使用protobuf-net進行反序列化時遇到問題。

我有以下課程:

[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 ");
}

_foo字段反序列化完成之前,將觸發方法Add

我該如何解決這個問題?

您需要將其用於CrazList屬性;

[ProtoBuf.ProtoContract(IgnoreListHandling=true)]

與XmlSerializer一樣,某些東西可以列表,也可以是葉子。 沒有“兩者”。 此刻,它將檢測“列表”,並且不會尋找葉成員。 您可以將其更改為一片葉子(請參閱Fredou的答案),但是它不會序列化這些項。

由於導線規格的不同(由Google而不是由我提供),列表本身沒有表示形式:重復的序列只是:“項目,項目,項目,項目”。 因此,如果某物是一個列表,則實際上沒有地方可以存儲與列表本身有關的數據。

坦白說,最簡單的選擇就是重構封裝,例如(為了簡潔起見,最小化):

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

您也可以或許,如果你需要,使用方法Fredou節目,並增加欺騙:

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

這將使它看起來像上面的最小示例,而實際上沒有以任何重大方式更改模型。

順便說一句:不建議為List<T>子類提供自定義Add,並且您不應該依賴反序列化的順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM