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

时间:2013-08-19 07:10:36

标签: 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);
    }
}

现在,如果我在&#39; ITestMessage&#39;之间宣布继承依赖关系。 &安培; &#39; MyOrder&#39;通过代码使用:

RuntimeTypeModel.Default[typeof(ITestMessage)].AddSubType(2, typeof(MyOrder));

尝试反序列化我以前保存的数据时出现以下错误。 &#34;找不到ITestMessage&#34;的无参数构造函数。

[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&#39; MyOrderWrapper&#39;没有引用高于“MyOrder”的任何内容。在继承hirarchy。

另外,当我明确地包含&#39; [ProtoInclude(2,typeof(MyOrder))]&#39; on&#39; ITestMessage&#39;

由于

1 个答案:

答案 0 :(得分:1)

基本上,就串行器而言,这是一个突破性的变化 - 在线层,既没有“类”也没有“接口”,所以在存储方面,这类似于改变基类型类;序列化时,根类型为MyOrder - 在反序列化期间,根类型为ITestMessage。这不会让它开心。

基本上:你做不到。