私はxmlスキーマ定義ファイルを使用して複数の部分クラスを含むDespatchAdvice.designer.csファイルを生成するツールXsd2Codeを利用しています。私のプログラムでは、関連するデータを簡単に入力し、xmlに出力をシリアライズすることができます。別のクラスのパブリックプロパティを飾ることは可能ですか?
しかし、しばしばそうであるように、すべてが私がそれを好むとは限りません。私は最終的にシリアライズされる要素のいくつかを必要とせず、単にデータを入力しても空要素としてシリアライズされません。結果として得られるxmlは、顧客によって設定された厳しい基準を満たさなければならず、これらの空の要素はそれらの基準を「破る」。
私はこれを回避するためにいくつかの選択肢があります。これらの要素を元のxsdスキーマファイルから削除することはできますが、それらはGS1標準化団体によって作成されており、更新は自分のカスタマイズを破るか、少なくとも再適用する必要があります。
また、Xsd2Codeで生成された.csファイルを変更して、不要なプロパティを削除することもできます。しかし、上記と同じように、.csファイルを再生成すると、私の変更が破棄されます。
私が現在取り組んでいるアプローチは、XmlIgnoreAttribute()を使って.csファイルの不要なプロパティを飾ることです。次のコードフラグメントでは、マニフェストはツールによって生成されましたが、結果のXMLで直列化してはいけません。すべてのコードは、XmlIgnoreAttribute行を除いて自動的に生成されました。
[System.Xml.Serialization.XmlElementAttribute(Order = 3)]
public DocumentIdentification DocumentIdentification
{
get
{
return this.documentIdentificationField;
}
set
{
this.documentIdentificationField = value;
}
}
[System.Xml.Serialization.XmlIgnoreAttribute()] // Exclude Manifest
[System.Xml.Serialization.XmlElementAttribute(Order = 4)]
public Manifest Manifest
{
get
{
return this.manifestField;
}
set
{
this.manifestField = value;
}
}
[System.Xml.Serialization.XmlArrayAttribute(Order = 5)]
[System.Xml.Serialization.XmlArrayItemAttribute(IsNullable = false)]
public List<Scope> BusinessScope
{
get
{
return this.businessScopeField;
}
set
{
this.businessScopeField = value;
}
}
私の質問の要点です。生成されたDespatchAdvice.designer.csファイルを変更せずにXmlIgnoreAttributeを適用する方法はありますか(過負荷でManifestブロック全体を再コードする必要はありません)。
編集:
これらは、.csファイルを生成する際に使用したオプションです。デフォルト値から変更した値が強調表示されます。
他のクラスは 'partial'宣言されていますか? –
Romano、あなたが参照している「他の」クラスが不明です。生成された.csには、複数の部分クラスが含まれています。他のすべてのクラスは私のプログラムクラスです(部分的ではありませんが、それは助けになるでしょうか?)。残念ながら、部分クラスは私には分かりません。 –
これを実証する[mcve]を提供できますか? (通常は)プロパティをnullに設定すると、それがまったくシリアル化されないため、[this fiddle](https://dotnetfiddle.net/jKW2L6)を参照してください。つまり、あなたが求めていることはおそらく['XmlAttributeOverrides'](https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributeoverrides(v = vs.110))で行うことができます。 aspx)。 –