【问题标题】:Protobuf-net deserializing after defining inheritance定义继承后的 Protobuf-net 反序列化
【发布时间】:2013-08-19 07:10:35
【问题描述】:

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    基本上,就序列化程序而言,这是一个重大变化——在线路层,既不存在“类”也不存在“接口”,因此在存储方面,这类似于更改班级;序列化时,根类型为MyOrder - 在反序列化期间,根类型为ITestMessage。这不会让它快乐。

    基本上:你不能那样做。

    【讨论】:

    • 为什么它可以与明确定义的属性一起工作?另外,关于如何解决这个问题的任何建议?即重新读取以前的数据,然后构建一个新模型以包含关系。
    • @Prin 你的意思是“另外,为什么当我在 'ITestMessage' 上明确包含 '[ProtoInclude(2, typeof(MyOrder))]' 时它会起作用” - 嗯;我得看看,但我怀疑这实际上不是模型的一部分;它会自动检测基于基本类型的合约,但我认为它不会遍历接口,因为它们在重要方面的工作方式非常不同
    猜你喜欢
    • 2012-11-16
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2012-04-26
    相关资源
    最近更新 更多