帮助需要最简单的protobuf-net示例4

时间:2011-06-08 21:57:17

标签: protobuf-net

  [DataContract]
  public class I<TId>
  {
    [DataMember(Order = 1)]
    public TId Id { get; set; }
  }

  [DataContract]
  public class J : I<int>
  {
    [DataMember(Order = 1)]
    public string Description { get; set; }
  }

  class Program
  {
    static void Main()
    {
      var o = new J { Id = 5, Description = "xa-xa", };
      using (var ms = new MemoryStream())
      {
        Serializer.Serialize(ms, o);
        ms.Position = 0;
        var o2 = Serializer.Deserialize<J>(ms);
        Debug.Assert(o.Id == o2.Id);
      }
    }
  }

为什么断言失败以及如何解决?

感谢。

1 个答案:

答案 0 :(得分:1)

它失败了,因为protobuf-net不能处理继承,除非你通过属性或运行时类型模型给它更多线索 - 基本上它需要从某个地方(即你)获得一个字段号。我满足于承认在这种情况下可能跟踪警告可能是有用的,因为合理地清楚地知道这个继承方案可能比J更多。

以下添加(在运行时)修复了它:

RuntimeTypeModel.Default.Add(typeof(I<int>), true).AddSubType(2, typeof(J));

2的唯一重要性是它与I<int>}定义的任何其他字段不冲突。