何役立ちます希望は、それが数字キーにメンバーを解決するための方法を持っていることです。このはとなります。たとえば、[DataContract]
/[DataMember(Order=key)]
、[XmlType]
/[XmlElement(Order=key)]
、または[ProtoContract]
/[ProtoMember(key)]
となります。
も推論アルファベット順の契約に[DataContract]
経由のオプションがありますが、あなたの契約種別がが将来を変更するつもりはないされている場合にのみ安全です。これを行うには、次のように追加してください:
[ProtoContract(InferTagFromName = true)]
(おそらく部分的には、以下を参照してください)。これは、提示するシナリオに直接適用されます。[DataMember]
はメンバーを示しますが、定義されているのはOrder
です。個人的に私は安定性のために明示的なレイアウトを好みます。
別のオプションでも、[DataMember]
のようなヒントは必要ありません。 BinaryFormatter
ルール(すべてのフィールド、パブリックまたはプライベート)、またはXmlSerializer
ルール(パブリックメンバー、プロパティまたはフィールド)のいずれかを適用するよう依頼できます。あなたのタイプが変わっても、非常にが不安定です。
[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
しかし、もう1つの一般的なシナリオは、ジェネレータからのタイプのもので、編集が簡単ではないことです。これは、編集が再生成時に失われるためです。 の場合はシナリオでは、partial
クラスが役立ちます。属性を使用してメンバーに属性を追加することはできませんが、ここでは[ProtoPartialMember]
が役に立ちます。例えば、別々のコードファイルで:
[ProtoContract]
[ProtoPartialMember(key, memberName)]
[ProtoPartialMember(anotherKey, anotherMemberName)]
...
public partial class Order {}
時には、あなたはとてもオプションではありませんどのような種類の属性を追加し、型に一切アクセスを持っていません。あなたが説明するように、あなたのシナリオがある場合は([のDataContractは/
[DataMemberを] , no
Order`)、その後、怠惰オプションは、グローバルに、これを有効にすることです:については
RuntimeTypeModel.Default.InferTagFromNameDefault = true;
:
Serializer.GlobalOptions.InferTagFromName = true;
またはv2で
RuntimeTypeModel.Default.Add(typeof(Order), false)
.Add(key, memberName).Add(anotherKey, anotherMemberName);
:v2は、実行時にレイアウトを設定することができますこれに専念新しいMetaType
モデルを、持っているより複雑なシナリオ、またはあなたのキーがある場合は1、2、3、...そしてちょうど:
I
RuntimeTypeModel.Default.Add(typeof(Order), false) .Add(memberName, anotherMemberName, ...);
(連載のすべての側面を制御するMetaType
上の無数のオプションがあります)
ここのオプションのほとんどをカバーすると思うのはだと思います!
RuntimeTypeModel.Default.InferTagFromNameDefault = true;ありがとうございます。 –
@Paulちょうど上記の強調に注意してください。それはアルファベット順であるため、メンバーが追加された場合** **安定していません。あなたが 'AardvarkCount'を追加すると、すべてのものが突然オフ・バイ・ワンになります –