C# 为什么赢了';t我的列表<;Foo>;用protobuf-net序列化?

C# 为什么赢了';t我的列表<;Foo>;用protobuf-net序列化?,c#,protobuf-net,C#,Protobuf Net,然后,在代码中我设置了一个新的TypeModel并添加了我的子类型 [DataContract] public class Foo { [DataMember(Order = 1)] public int FooId { get; set; } } [DataContract] public class Bar : Foo { [DataMember(Order = 2)] public string Name { get; set; } } [DataContract] p

然后,在代码中我设置了一个新的TypeModel并添加了我的子类型

[DataContract] public class Foo 
{
   [DataMember(Order = 1)] public int FooId { get; set; }
}

[DataContract] public class Bar : Foo 
{
   [DataMember(Order = 2)] public string Name { get; set; }
}

[DataContract] public class Baz : Bar
{
    [DataMember(Order = 3)] public string BazName { get; set; }
}
现在,我可以序列化Foo、Bar和Baz的实例了。如果我序列化

_ProtobufSerializer = TypeModel.Create();
_ProtobufSerializer.Add(typeof(Bar), true);
_ProtobufSerializer.Add(typeof(Baz), true);
var type = _ProtobufSerializer.Add(typeof(Foo), true);
type.AddSubType(100, typeof(Bar));
type.AddSubType(101, typeof(Baz));
var listThatWorks = new List<Foo> { new Foo { FooId = 12 } }
var anotherListThatWorks = new List<Foo> { new Bar { FooId = 12, Name = "Test" } }
var listThatWorks=new List{new Foo{FooId=12}
var anotherListThatWorks=new List{new Bar{FooId=12,Name=“Test”}
那很好。但是,如果我序列化

_ProtobufSerializer = TypeModel.Create();
_ProtobufSerializer.Add(typeof(Bar), true);
_ProtobufSerializer.Add(typeof(Baz), true);
var type = _ProtobufSerializer.Add(typeof(Foo), true);
type.AddSubType(100, typeof(Bar));
type.AddSubType(101, typeof(Baz));
var listThatWorks = new List<Foo> { new Foo { FooId = 12 } }
var anotherListThatWorks = new List<Foo> { new Bar { FooId = 12, Name = "Test" } }
var fails=newlist{newbaz{FooId=12,Name=“Test”}
然后我得到一个InvalidOperationException,消息是“意外的子类型:Baz”。我做错了什么?在protobuf-net中使用子类型是个坏主意吗


另外,感谢@BFree帮助我弄明白这与拥有两个级别的子类有关。

明白了。真的,我应该把这归功于自由。他制作了一个可运行的示例应用程序,向我展示了我原来的帖子过于简化。真正的问题是我的对象模型,其中Baz是Bar的一个子类,而Bar本身就是Foo的一个子类。当我设置TypeModel时,我没有正确指定这个结构。应该是:

var fails = new List<Foo> { new Baz { FooId = 12, Name = "Test" } }

实际上,我不确定订单值,但我知道这些工作。

相关问题:@m.Babcock-我看到了。我相信最高层的回应是指protobuf net的旧版本(可能是错误的)。我只是在一个简单的控制台应用程序中尝试了你的代码:它对我有效,没有例外……@BFree-wow,我能把我的一些分数贡献给你吗?谢谢你把这些放在一起。结果我过度简化了我的示例,显然我的问题与两个级别的子分类有关。我要更新这篇文章。今晚可以看一下-现在不用看电脑了-回来看一下-很高兴你把它整理好了。