当在protobuf.net中使用继承时,do标记必须在整个继承树中是唯一的

本文关键字:继承 唯一 net protobuf 当在 do | 更新日期: 2023-09-27 18:06:22

我很难找到一个明确的答案。我从文档的理解是,类中的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; }
}

正确吗?如果是这样,当序列化的属性被覆盖时会发生什么?

当在protobuf.net中使用继承时,do标记必须在整个继承树中是唯一的

标签必须在整个继承树中唯一吗?

不,他们没有。你的理解是正确的。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冲突。

在该类型之外没有冲突。其他类型可以使用"sub-type 1",其他类型可以使用"property 1",等等