Protobuf网络在定义继承后反序列化
本文关键字:反序列化 继承 定义 网络 Protobuf | 更新日期: 2023-09-27 18:28:13
我使用protobuf net 2.0.0.640版本来序列化一些数据,如下所示。
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public interface ITestMessage
{
}
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public class MyOrder : ITestMessage
{
public int Amount { get; set; }
}
[ProtoContract(ImplicitFields = ImplicitFields.AllFields)]
public class MyOrderWrapper
{
public MyOrder Order { get; set; }
}
[TestMethod]
public void TestOrderSerialize()
{
var order = new MyOrder() {Amount = 10};
var orderWrapper = new MyOrderWrapper() { Order = order };
using (var file = File.Create("C:''temp''order.bin"))
{
Serializer.Serialize<MyOrderWrapper>(file, orderWrapper);
}
}
现在,如果我声明"ITestMessage"answers"MyOrder通过代码使用:
RuntimeTypeModel.Default[typeof(ITestMessage)].AddSubType(2, typeof(MyOrder));
在尝试反序列化以前保存的数据时,我遇到了以下错误。"找不到ITestMessage的无参数构造函数"。
[TestMethod]
public void TestOrderDeserialize()
{
RuntimeTypeModel.Default[typeof(ITestMessage)].AddSubType(2, typeof(MyOrder));
MyOrderWrapper orderWrapper;
using (var file = File.OpenRead("C:''temp''order.bin"))
{
orderWrapper = Serializer.Deserialize<MyOrderWrapper>(file);
}
}
有人能解释一下,当"MyOrderWrapper"在继承层次结构中没有引用任何高于"MyOrder"的内容时,为什么会发生这种情况吗。
此外,当我在"ITestMessage"上明确包含"[ProtoInclude(2,typeof(MyOrder))]"时,为什么它有效
感谢
基本上,就序列化程序而言,这是一个突破性的更改-在布线层,既不存在"类"也不存在"接口",因此在存储方面,这类似于更改类的基本类型;在序列化时,根类型为MyOrder
-在反序列化期间,根类型是ITestMessage
。这不会让它高兴。
基本上:你不能那样做。