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

时间:2011-08-23 17:18:29

标签: c# inheritance protobuf-net

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

这是对的吗? 如果是这样,当重写序列化属性时会发生什么?

非常感谢。

1 个答案:

答案 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”等。