1

シナリオは次のとおりです。

[ProtoContract]
class A{}

しばらくして、別の開発者が次のように追加します。

class B : A {
  int m;
}

クラスにProtoContractAttributeがない場合、またはGoogle Protocol Buffersのシリアル化中にエラーが発生した場合は、XMLにフォールバックします。上記のコードの問題は、AからのB固有のProtoContractAttribute(以下では、Attached = 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 に答える