gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:25:21 26 4
gpt4 key购买 nike

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

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

_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" } }

然后我得到一个 InvalidOperationException 消息“Unexpected sub-type: Baz”。我究竟做错了什么?将子类型与 protobuf-net 一起使用只是个坏主意吗?

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

最佳答案

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

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

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

关于c# - 为什么我的 List<Foo> 不能用 protobuf-net 序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9928027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com