クラスオブジェクトを 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>