1

这是一个场景:

[ProtoContract]
class A{}

过了一会儿,另一个开发人员补充道:

class B : A {
  int m;
}

如果一个类没有 ProtoContractAttribute 或在 Google Protocol Buffers 序列化期间出现错误,我将回退到 XML。上面代码的问题是 B 来自 A 的固有 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")
{...}

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

谢谢!

4

1 回答 1

1

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

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

但是,我也在调查如果我们将其设为非继承会出现什么问题。被继承的东西看起来有点不对劲!

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

于 2012-08-10T05:09:03.837 回答