[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);
}
}
}
为什么断言失败以及如何解决?
感谢。
答案 0 :(得分:1)
它失败了,因为protobuf-net不能处理继承,除非你通过属性或运行时类型模型给它更多线索 - 基本上它需要从某个地方(即你)获得一个字段号。我满足于承认在这种情况下可能跟踪警告可能是有用的,因为合理地清楚地知道这个继承方案可能比J
更多。
以下添加(在运行时)修复了它:
RuntimeTypeModel.Default.Add(typeof(I<int>), true).AddSubType(2, typeof(J));
(2
的唯一重要性是它与I<int>
}定义的任何其他字段不冲突。