ProtoContractAttribute with Inherited = false

时间:2012-08-09 22:17:57

标签: .net protobuf-net

这是一个场景:

[ProtoContract]
class A{}

一段时间后,另一位开发人员补充道:

class B : A {
  int m;
}

如果某个类没有ProtoContractAttribute或在Google Protocol Buffers序列化过程中出错,我会回退到XML。 上面代码的问题是来自A的B固有的ProtoContractAttribute(注意下面的Inherited = true),但是成员'm'不会被序列化,因为它没有ProtoMemberAttribute。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum 
| AttributeTargets.Interface, AllowMultiple = false, Inherited = true)]
public sealed class ProtoContractAttribute : Attribute
{...}

能够添加:

会很棒
[AttributeUsage(AttributeTargets.Class, Inherited = true)]
public class ProtoContractWithoutInheritance : ProtoBuf.ProtoContractAttribute
{
}

但ProtoContractAttribute是密封的,即使它没有被密封,ProtoBuf-Net正在寻找显式类型:

if (item.AttributeType.FullName == "ProtoBuf.ProtoContractAttribute")
{...}

任何解决方案/解决方法?

谢谢!

1 个答案:

答案 0 :(得分:1)

嗯,我能想到的最简单的解决方法是:

bool isProto = Attribute.IsDefined(
    yourType, typeof(ProtoContractAttribute), false);

然而,我也正在研究如果我们将这种非继承性破坏了什么。继承的东西看起来有点不对劲!

编辑:这也应该从r571开始修复;该属性现在未标记为已继承。