2017-07-11 17 views
0

私は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ファイルを生成する際に使用したオプションです。デフォルト値から変更した値が強調表示されます。

Xsd2Code options selected

+0

他のクラスは 'partial'宣言されていますか? –

+0

Romano、あなたが参照している「他の」クラスが不明です。生成された.csには、複数の部分クラスが含まれています。他のすべてのクラスは私のプログラムクラスです(部分的ではありませんが、それは助けになるでしょうか?)。残念ながら、部分クラスは私には分かりません。 –

+1

これを実証する[mcve]を提供できますか? (通常は)プロパティをnullに設定すると、それがまったくシリアル化されないため、[this fiddle](https://dotnetfiddle.net/jKW2L6)を参照してください。つまり、あなたが求めていることはおそらく['XmlAttributeOverrides'](https://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlattributeoverrides(v = vs.110))で行うことができます。 aspx)。 –

答えて

0

Xsd2Codeは、すべてのフィールドを初期化するためのオプションを持っているので、私は「デフォルト」Manifestが作成されていることが何であるかを、ここで起こる疑いがあり、オブジェクトグラフをシリアル化するとき、それはどのようなあなたのシーイングです。

XmlSerializer挙動はXmlElement属性がtrueIsNullable propertyセットを持っていない限り、nullの要素を省略することです。その場合、xsi:nil="true"属性を持つ空の要素をシリアライズします。

したがって、(XmlAttributeOverridesを使用して達成できる)属性を追加または上書きしようとするのではなく、除外する要素をnullに設定することをお勧めします。

+0

オリジナルの投稿を編集して、私が使ったXsd2Codeオプションを追加しました。あなたは、あなたが "すべてのフィールドを初期化"することを指しているオプションを指定してください - それらのどれもがその正確な記述を持っていないようです。 –

+0

@WayneIvory私の推測は 'EnableInitializeFields = True'(スクリーンショットの2番目のプロパティ)です。これは、例えば、 'Manifest = new Manifest();はコンストラクタで生成されます。これは、ヌル参照を気にせずにプロパティを設定するだけで便利なことがよくあります。 –

関連する問題