c# - 定义继承后的 Protobuf-net 反序列化

标签 c# .net protocol-buffers protobuf-net

我正在使用 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”和“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))]”时它会起作用

谢谢

最佳答案

基本上,就序列化器而言,这是一个突破性的变化——在线路层,“类”和“接口(interface)”都不存在,所以在存储方面,这类似于改变类(class);在序列化时,根类型是 MyOrder - 在反序列化过程中,根类型是 ITestMessage。这不会让它开心。

基本上:你不能那样做。

关于c# - 定义继承后的 Protobuf-net 反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18308218/

相关文章:

c# - 模拟像计算器这样的类的目的是什么?

.net - .NET 是否消除了各种语言之间的区别?

c# - 使用指向属性的 func 设置值

c# - 使用 C# 将非常大的项目列表序列化到 Azure blob 存储中

c# - 如何使用 .NET 的 MongoDB 驱动程序的 updateOne() 更新但不替换文档

c# - 我需要使用 Syncfusion Essential Studio 还是可以只使用 NuGet 包?

c# - 从动态数据透视表中加入具有匿名列的列表

.net - 多 ORM 解决方案

c++ - protobuf 库在消息实例化时抛出 FatalException

caching - AutoProtoSchemaBuilder 未生成原型(prototype)文件