C# protobuf网络列表<&燃气轮机;继承反序列化

C# protobuf网络列表<&燃气轮机;继承反序列化,c#,list,serialization,protocol-buffers,protobuf-net,C#,List,Serialization,Protocol Buffers,Protobuf Net,我在使用protobuf net进行反序列化时遇到问题 我有以下课程: [ProtoContract] public class CrazyList : List<string> { [ProtoMember(1)] private readonly string _foo; public CrazyList(string foo) { _foo = foo; } public CrazyList(){}

我在使用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);
    }

}
[协议]
公共类疯狂列表:列表
{
[原成员(1)]
私有只读字符串\u foo;
公共疯狂列表(字符串foo)
{
_foo=foo;
}
公共疯狂列表(){}
公共新空添加(字符串项)
{
Console.Write(item+foo);//问题就在这里!
基础。添加(项目);
}
}
然后像这样使用它:

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 ");
}
var list=newCrazyList(“世界!”);
添加(“你好”);
使用(var ms=new MemoryStream())
{
Serializer.Serialize(ms,list);
ms.Position=0;
var listDS=序列化程序。反序列化(ms);
添加(“再见”);
}
方法
Add
\u foo
字段反序列化完成之前触发


如何解决此问题?

您需要将其用于CrazList属性

[ProtoBuf.ProtoContract(IgnoreListHandling=true)]

与XmlSerializer一样,是一个列表,或者是一个叶子。没有“两者皆有”。目前,它将检测“列表”,而不会查找叶成员。您可以将其更改为一个叶(请参见Fredou的答案),但它不会序列化这些项

由于wire规范(由google,而不是我)如何定义,列表本身没有表示:重复的序列只是:“item,item,item,item”。因此,如果某个东西是一个列表,那么实际上我没有地方可以存储与列表本身相关的数据

坦率地说,最简单的选择是重构以封装,例如(为简洁起见,这是最小的):

class-SomeWrapper{
字符串Foo。。。
列出项目。。。
}
如果需要,您也可以使用Fredou展示的方法进行欺骗,并添加:

[ProtoMember(2)]
private IList<string> Items { get { return this; } }
[原成员(2)]
私有IList项{get{返回此;}}
这将使它看起来像上面的最小示例,而不会以任何显著的方式实际更改模型

顺便说一句:不建议为
列表
子类提供自定义添加,并且不应依赖反序列化顺序

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