【发布时间】:2012-03-29 14:59:08
【问题描述】:
[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 消息“意外的子类型:Baz”。我究竟做错了什么?在 protobuf-net 中使用子类型只是一个坏主意吗?
另外,感谢@BFree 帮助我弄清楚这与拥有两个级别的子类有关。
【问题讨论】:
-
@M.Babcock - 我看到了。我相信最重要的回应是指旧版本的 protobuf-net(可能是错误的)。那,建议的答案不起作用。
-
我刚刚在一个简单的控制台应用程序中尝试了您的代码:pastie.org/3692350,它对我有用,没有例外......
-
@BFree - 哇,我可以把我的一些积分捐给你吗?谢谢你把它放在一起。结果我过度简化了我的例子,显然我的问题与两个级别的子分类有关。我要更新帖子了。
-
今晚可以看 - 现在不在 PC 上
标签: c# protobuf-net