为什么我的List不能用protobuf-net序列化

本文关键字:不能 protobuf-net 序列化 Foo 我的 List 为什么 | 更新日期: 2023-09-27 18:29:20

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

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

_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));

现在,我可以很好地序列化 Foo、Bar 和 Baz 的实例。如果我序列化

var listThatWorks = new List<Foo> { new Foo { FooId = 12 } }
var anotherListThatWorks = new List<Foo> { new Bar { FooId = 12, Name = "Test" } }

这工作正常。但是,如果我序列化

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

然后我收到一个带有消息"意外子类型:Baz"的无效操作异常。我做错了什么?将子类型与 protobuf-net 一起使用只是一个坏主意吗?

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

为什么我的List<Foo>不能用protobuf-net序列化

知道了。真的,我应该把功劳归功于BFree。他整理了一个可运行的示例应用程序,向我展示了我的原始帖子过于简化。真正的问题是我的对象模型,其中 Baz 是 Bar 的一个子类,它本身就是 Foo 的一个子类。当我设置类型模型时,我没有正确指定此结构。应该是:

_ProtobufSerializer = TypeModel.Create();
_ProtobufSerializer.Add(typeof(Baz), true);
var barType = _ProtobufSerializer.Add(typeof(Bar), true);
var fooType = _ProtobufSerializer.Add(typeof(Foo), true);
fooType.AddSubType(100, typeof(Bar));
barType .AddSubType(101, typeof(Baz));

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