[英]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.