シリアライズ可能なクラスにいくつかの null 許容値型を追加しました。を使用してシリアル化を実行しXmlSerializer
ますが、値が に設定されている場合null
、 で空のノードを取得しますxsi:nil="true"
。Xsi:nil Attribute Binding Supportで見つけたように、これは正しい動作です。
値の型が のときに何も出力されないように、このオプションをオフにする方法はありnull
ますか?
シリアライズ可能なクラスにいくつかの null 許容値型を追加しました。を使用してシリアル化を実行しXmlSerializer
ますが、値が に設定されている場合null
、 で空のノードを取得しますxsi:nil="true"
。Xsi:nil Attribute Binding Supportで見つけたように、これは正しい動作です。
値の型が のときに何も出力されないように、このオプションをオフにする方法はありnull
ますか?
私は同じ問題を抱えていました..これは、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 許容要素をチェックしています。
ShouldSerialize
null 許容値ごとにメソッドを追加する必要がありました。
[Serializable]
public class Parent
{
public int? Element { get; set; }
public bool ShouldSerializeElement() => Element.HasValue;
}
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;
}
}
私はこのようにそれを達成しました:
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); }
}