[ VB.NET / C# ] 数値やbool型をXMLシリアライズの対象から除外する

Pocket

クラスオブジェクトを 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>
スポンサーリンク

Pocket

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>