2010年1月27日水曜日

.NET シリアライズ・デシリアライズ ~XmlSerializerクラス~

オブジェクトの内容をファイルに保存(シリアライズ)、また復元(デシリアライズ)しようと思います。
方法は3種類あります。
  1. System.Xml.Serialization.XmlSerializerクラスを使用する方法
  2. System.Runtime.Serialization.Formatters.Soap.SoapFormatterクラスを使用する方法
  3. System.Runtime.Serialization.Formatters.Binary.BinaryFormatter クラスを使用する方法


XmlSerializerクラスはオブジェクトをXMLファイルに保存復元できます。
私が良く使うのは設定ファイルなどをExcelで記述し、ExcelからXMLに出力します。
そのXMLファイルを読み込んでオブジェクトに復元しアプリ内で使用したりしています。


SoapFormatterクラスはオブジェクトをSOAP仕様に従ってXMLファイルに保存復元できます。
Webサービスとデータをやり取りする場合に使用しています。


BinaryFormatterクラスはオブジェクトをバイナリファイルに保存復元できます。
ユーザーに簡単に変更されたくない場合などに使用しています。


参考URL
DOBON.NETN オブジェクトの内容をバイナリファイルに保存する
DOBON.NETN オブジェクトの内容をファイルに保存、復元する
@IT 連載 .NETで簡単XML
伊勢的新常識 XmlSerializer について


XmlSerializerクラスを使用してオブジェクトをXMLファイルに保存・復元する


System.Xml.Serialization.XmlSerializerクラスを使用しオブジェクトをXMLファイルに保存・復元します。
基本的にクラスにSerializable属性をつけるだけでシリアライズ・デシリアライズ可能です。
シリアライズしたくないプロパティにはXmlIgnore属性をつけます。

注意点
シリアライズ・デシリアライスするプロパティはSetter、Getterの両方が必要。
引数を取らないコンストラクタが必要。(特に引数を取るコンストラクタを定義した場合はデフォルトコンストラクタがないので明示的に引数を取らないコンストラクタを定義する)

簡単なサンプルです。
Public Class Form1
 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     'シリアライズ
     Dim ss As New SerializeSample
     ss.Cd = 1
     ss.Child = New Child("taro", 5)

     Using fs As New System.IO.FileStream("D:\SerializeSample.xml", IO.FileMode.Create, IO.FileAccess.Write)
         Dim xs As New System.Xml.Serialization.XmlSerializer(GetType(SerializeSample))
         xs.Serialize(fs, ss)
         fs.Close()
     End Using
 End Sub

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
   'デシリアライズ
     Dim ss As SerializeSample

     Using fs As New System.IO.FileStream("D:\SerializeSamplet.xml", IO.FileMode.Open)
         Dim xs As New System.Xml.Serialization.XmlSerializer(GetType(SerializeSample))
         ss = CType(xs.Deserialize(fs), SerializeSample)
         fs.Close()
     End Using

     Console.WriteLine(ss.Cd)
     Console.WriteLine(ss.Child.ToString)
 End Sub
End Class

<Serializable()> _
Public Class SerializeSample

    Private _cd As Integer
    Private _child As Child
    Private _unSerialize As String

    Public Property Cd() As Integer
        Get
            Return Me._cd
        End Get
        Set(ByVal value As Integer)
            Me._cd = value
        End Set
    End Property

    Public Property Child() As Child
        Get
            Return Me._child
        End Get
        Set(ByVal value As Child)
            Me._child = value
        End Set
    End Property

    <System.Xml.Serialization.XmlIgnore()> _
    Public Property UnSerialize() As String
        Get
            Return Me._unSerialize
        End Get
        Set(ByVal value As String)
            Me._unSerialize = value
        End Set
    End Property

    Public Sub New()
    End Sub

End Class

<Serializable()> _
Public Class Child

    Private _name As String
    Private _age As Integer

    Public Property Name() As String
        Get
            Return Me._name
        End Get
        Set(ByVal value As String)
            Me._name = value
        End Set
    End Property

    Public Property Age() As Integer
        Get
            Return Me._age
        End Get
        Set(ByVal value As Integer)
            Me._age = value
        End Set
    End Property


    Protected Sub New()
    End Sub

    Public Sub New(ByVal name As String, ByVal age As Integer)
        Me._name = name
        Me._age = age
    End Sub

    Public Overrides Function ToString() As String
        Return String.Format("Name:{0} Age:{1}", Me._name, Me._age)
    End Function

End Class

出力されたXMLファイルです。
<?xml version="1.0"?>
<SerializeSample xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Cd>1</Cd>
  <Child>
    <Name>taro</Name>
    <Age>5</Age>
  </Child>
</SerializeSample>

0 件のコメント: