16

一部のXMLの逆シリアル化に問題があります。サードパーティによって提供されるXMLは非常に冗長であるため、特定の要素に値が設定されていない場合は、要素を提供して空にします(例<element1 />)。

これは、整数を格納することを目的とした要素など、特定の要素の問題です。私はサードパーティを管理しているので、サードパーティにデフォルト値(<myinteger>0</myinteger>)を指定させるか、これらの要素を完全に省略させることができます。これらは両方とも問題を回避する必要があります。

ただし、将来、あまり制御できない状況が発生する可能性があります。その場合、おそらく装飾を介してデフォルト値を指定する方法はありますか?

    [XmlElement("myinteger")=0???]
    public int MyInteger
    {
        get
        {
            return myInteger;
        }
        set
        {
            myInteger= value;
        }
    }
4

2 に答える 2

42

XmlSerializer サポートしていますが、シリアライゼーション[DefaultValue]中に使用します。逆シリアル化中は、単にコンストラクターを実行し、受信した値を取得して適用します。したがって、一般的なアプローチは、コンストラクター (またはフィールド初期化子) を使用することです。

public Foo() {
    Bar = 4;
}
[DefaultValue(4), XmlAttribute("bar")]
public int Bar {get;set;}

しかし、; XmlSerializerこれに対する の解釈は、「空の要素を提供する」ではなく、「要素 (/属性) を省略する」ことです。「空」にもint?マップされません。の要素を処理するには、文字列として処理する必要があります。これは醜いです。

于 2010-08-16T10:54:44.823 に答える
0

[DefaultValue]を使用した装飾は、常に機能するとは限らないため、完全な解決策ではないようです。別の簡単な解決策(きれいではないかもしれません)

public string _sourceSubFolderName;
    [DefaultValueAttribute("")]
    [XmlElement("SourceSubFolderName")]
    public string SourceSubFolderName
    {
        get { return string.IsNullOrEmpty(_sourceSubFolderName) ? 
               string.Empty : _sourceSubFolderName; }
        set { _sourceSubFolderName = value; }
    }
于 2012-10-31T10:15:57.437 に答える