我很难找到一个明确的答案。我对文档的理解是,类中的ProtoInclude和ProtoMember标签需要 是独一无二的,但不是整棵树。
这意味着这应该没问题:
[ProtoContract]
[ProtoInclude(2, typeof(Employee))]
public class Person{
[ProtoMember(1)]
public string Name { get; set; }
}
[ProtoContract]
public class Employee : Person{
[ProtoMember(1)]
public string Department{ get; set; }
}
这是对的吗? 如果是这样,当重写序列化属性时会发生什么?
非常感谢。
答案 0 :(得分:3)
标记在整个继承树中必须是唯一的吗?
不,他们没有。你的理解是正确的。 protobuf-net通过封装派生类型实现继承作为填充程序,因此限制只是子类型的标记不得与本地类型内的任何其他标记冲突。所以:
// this contract is an INVALID example
[ProtoContract]
[ProtoInclude(1, typeof(Employee))]
public class Person{
[ProtoMember(1)]
public string Name { get; set; }
}
无效,因为子类型Employee
和属性Name
的标记发生冲突。
在这种类型之外没有冲突。其他类型可以使用“子类型1”,其他类型可以使用“属性1”等。