12

シリアライズ可能なクラスにいくつかの null 許容値型を追加しました。を使用してシリアル化を実行しXmlSerializerますが、値が に設定されている場合null、 で空のノードを取得しますxsi:nil="true"Xsi:nil Attribute Binding Supportで見つけたように、これは正しい動作です。

値の型が のときに何も出力されないように、このオプションをオフにする方法はありnullますか?

4

6 に答える 6

8

私は同じ問題を抱えていました..これは、XMLへのシリアル化中にnull許容値型を処理することについて読んだ場所の1つです: http://stackoverflow.com/questions/244953/serialize-a-nullable-int

null許容値型の追加プロパティを作成するなど、組み込みパターンの使用について言及しています。という名前のプロパティのように

public int? ABC

どちらかpublic bool ShouldSerializeABC() {return ABC.HasValue;} または publicを追加する必要がありますbool ABCSpecified { get { return ABC.HasValue; } }

私はxmlにシリアライズしてSQLストアドプロシージャに送信するだけだったので、私もクラスを変更することを避けました。[not(@xsi:nil)].value() クエリ内のすべての null 許容要素をチェックしています。

于 2010-06-06T12:25:53.590 に答える
5

ShouldSerializenull 許容値ごとにメソッドを追加する必要がありました。

[Serializable]
public class Parent
{
    public int? Element { get; set; }

    public bool ShouldSerializeElement() => Element.HasValue;
}
于 2018-08-31T20:01:17.340 に答える
4

public bool ABCSpecified だけが .NET 4.0 で動作することがわかりました。XmlIgnoreAttribute も追加する必要がありました

Web 参照 Resource.cs ファイルで ABC という名前の文字列を抑制するための完全な解決策は次のとおりです。

// backing fields
private string abc;
private bool abcSpecified; // Added this - for client code to control its serialization

// serialization of properties
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public string ABC
{
    get
    {
        return this.abc;
    }
    set
    {
        this.abc= value;
    }
}

// Added this entire property procedure
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool ABCSpecified
{
    get
    {
        return this.abcSpecified;
    }
    set
    {
        this.abcSpecified = value;
    }
}
于 2011-04-15T05:23:10.517 に答える
0

私はこのようにそれを達成しました:

    private bool retentionPeriodSpecified;
    private Nullable<int> retentionPeriod;

    [XmlElement(ElementName = "retentionPeriod", IsNullable = true, Order = 14)]
    public Nullable<int> RetentionPeriod { get => retentionPeriod; set => retentionPeriod = value; }

    [System.Xml.Serialization.XmlIgnore()]
    public bool RetentionPeriodSpecified
    {
        get { return !(retentionPeriod is null); }
    }
于 2019-07-11T15:37:27.810 に答える