クラスオブジェクトを XML にシリアライズするときには、string 型のような null 値を許容する型の場合は、値が null のときシリアライズの対象にはなりません。しかし、数値型や bool 型などの場合は null 値を代入することはできませんので、必ず XML シリアライズの対象になってしまいます。ここでは、そのような数値型や bool 型であっても、ある値の場合には XML シリアライズの対象から除外するサンプルを掲載しています。
スポンサーリンク
DefaultValue を定義する
次のクラス定義のように、数値型や bool 型のように、null ( Nothing ) を許容しない型をシリアライズの対象からはずす条件を DefaultValue によって定義できます。XmlIgnore を定義することによって常に XML シリアライズの対象から除外することもできます。詳細はコメントを参照ください。
VB.NET
<XmlRoot("Root")>
Public Class XmlClass
' 無条件で、XML シリアライズの対象外
<XmlIgnore>
Public Item1 As DateTime = DateTime.Now
' null の場合は、XML には出力されない
' null 以外の場合はシリアライズされる
<XmlElement("Item2")>
Public Item2 As String = Nothing
' null の場合は、XML には出力しない
<XmlElement("Item3")>
Public Item3 As String = "NotNULL"
' 値が DefaultValue の場合は、XML には出力されない
' 値が DefaultValue 以外の場合は、XML には出力される
<XmlElement("Item4")>
<DefaultValue(110)>
Public Item4 As Integer = 0
' 無条件で XML に出力する
<XmlElement("Item5")>
Public Item5 As Integer = 0
' false 場合にはシリアライズ対象外
' true 場合にはシリアライズされる
<XmlElement("Item6")>
<DefaultValue(False)>
Public Item6 As Boolean = True
End Class
C#
[XmlRoot("Root")]
public class XmlClass
{
// 無条件で、XML に出力される
[XmlIgnore]
public DateTime Item1 = DateTime.Now;
// null の場合は、XML に出力されない
// null 以外の場合は、XML に出力される
[XmlElement("Item2")]
public string Item2 = null;
// null の場合は、XML には出力しない
[XmlElement("Item3")]
public string Item3 = "NotNULL";
// 値が DefaultValue の場合は、XML には出力しない
// 値が DefaultValue 以外の場合は、XML には出力する
[XmlElement("Item4")]
[DefaultValue(110)]
public int Item4 = 110;
// 無条件で XML に出力される
[XmlElement("Item5")]
public int Item5 = 0;
// false 場合には、シリアライズ対象外
// true 場合には、シリアライズされる
[XmlElement("Item6")]
[DefaultValue(false)]
public bool Item6 = true;
}
数値型、bool 型を XML シリアライズの対象項目から除外
次に上記のクラスオブジェクトを使って XML シリアライズします。下記はそのサンプルコードです。
VB.NET
Dim xmlfile As String = "D:\test.xml"
' XML シリアライズ
Using sw As New StreamWriter(xmlfile, False, Encoding.UTF8)
' 名前空間は出力しない
Dim ns As XmlSerializerNamespaces = New XmlSerializerNamespaces()
ns.Add(String.Empty, String.Empty)
' XML シリアライズするクラスのインスタンスを生成
Dim xc As New XmlClass()
xc.Item4 = 110 ' DefaultValue でXMLシリアライズの対象から除外
xc.Item6 = False ' DefaultValue でXMLシリアライズの対象から除外
' シリアライズ
Dim s As New XmlSerializer(GetType(XmlClass))
s.Serialize(sw, xc, ns)
End Using
C#
string xmlfile = @"D:\test.xml";
// XML シリアライズ
using (StreamWriter sw = new StreamWriter(xmlfile, false, Encoding.UTF8))
{
// 名前空間は出力しない
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add(String.Empty, String.Empty);
// XML シリアライズするクラスのインスタンスを生成
XmlClass xc = new XmlClass();
xc.Item4 = 110; // DefaultValue でXMLシリアライズの対象から除外
xc.Item6 = false; // DefaultValue でXMLシリアライズの対象から除外
// シリアライズ
XmlSerializer s = new XmlSerializer(typeof(XmlClass));
s.Serialize(sw, xc, ns);
}
XML の出力結果
上記のサンプルを実行して作成した XML ファイルは下記の通りです。
<?xml version="1.0" encoding="utf-8"?> <Root> <Item3>NotNULL</Item3> <Item5>0</Item5> </Root>