|
|
連載
.NETで簡単XML
第14回 オブジェクトをXMLでシリアライズ(6)
株式会社ピーデー 川俣 晶
2004/02/18 |
|
前回は、SoapFormatterクラスを使ったシリアライズについて解説を行った。今回は引き続きSoapFormatterクラスについて解説した後、XML Webサービス経由で使われるシリアライズについて説明する。
ISerializableインターフェイスを用いたシリアライズ制御
SoapFormatterクラスでシリアライズを行う際、シリアライズする内容をきめ細かく制御する方法がある。それは、ISerializableインターフェイス(System.Runtime.Serialization名前空間)を実装する方法である。このインターフェイスが実装されていると、SoapFormatterクラスはオブジェクト内のフィールドを勝手に拾い上げてシリアライズする代わりに、このインターフェイスのメソッドを呼び出してくれる。よって、このメソッド内で、必要な情報だけをシリアライズ対象に指定するようにコーディングすれば、思いどおりにシリアライズ結果を制御することができるわけである。NonSerialized属性を付けていないフィールドはすべてシリアライズされる、という大ざっぱな方法が好ましくない場合は、この方法を使うことができる。
それでは、ISerializableインターフェイスを実装したサンプル・コードを以下に示す(ただし、前回の最初のサンプル・ソースとの相違点のみ)。シリアライズ方法の制御は、シリアライズされる側のクラスで行われるため、シリアライズする側のコードに変更はない。以下は、シリアライズされる側のクラスのソース・コードである。
<Serializable()> _
Public Class Person
Implements ISerializable
Public Sub GetObjectData(ByVal info As SerializationInfo, ByVal context As StreamingContext) Implements ISerializable.GetObjectData
info.AddValue("Name", m_name)
info.AddValue("Address", m_address)
info.AddValue("Age", Age)
End Sub
Public Sub New()
End Sub
Protected Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
m_name = info.GetString("Name")
m_address = info.GetString("Address")
Age = info.GetInt32("Age")
End Sub
Private m_name As String = "未設定"
Private m_address As String = "未設定"
Public Age As Integer = 0
Private m_temporaryID As String = "未設定"
Public Property Name() As String
Get
Return m_name
End Get
Set(ByVal Value As String)
m_name = Value
End Set
End Property
Public ReadOnly Property Address() As String
Get
Return m_address
End Get
End Property
Public Sub SetTemporaryID(ByVal temporaryID As String)
m_temporaryID = temporaryID
End Sub
Public Sub Dump()
System.Diagnostics.Trace.WriteLine(m_name)
System.Diagnostics.Trace.WriteLine(m_address)
System.Diagnostics.Trace.WriteLine(Age)
System.Diagnostics.Trace.WriteLine(m_temporaryID)
End Sub
End Class |
|
サンプル・プログラム1:ISerializableインターフェイスを実装したPersonクラス(VB.NET版/C#版) |
これを実行すると、統合開発環境の出力ウィンドウに以下のような出力が得られる。
|
サンプル・プログラム1の出力結果 |
Personオブジェクトがシリアライズ/デシリアライズされる際に統合開発環境の出力ウィンドウに出力される結果。 |
また、シリアライズの結果として以下のような内容のXMLファイルが「c:\sample.xml」に生成される。
<SOAP-ENV:Envelope xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:clr="http://schemas.microsoft.com/soap/encoding/clr/1.0"
SOAP-ENV:encodingStyle=
"http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<a1:Person id="ref-1" xmlns:a1=
"http://schemas.microsoft.com/clr/nsassem/
VBSample019/VBSample019%2C%20Version%3D1.0.1437.20064%2C%20
Culture%3Dneutral%2C%20PublicKeyToken%3Dnull">
<Name id="ref-3">山田太郎</Name>
<Address id="ref-4">未設定</Address>
<Age>17</Age>
</a1:Person>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope> |
|
サンプル・プログラム1で生成されたXML文書 |
ここで注目していただきたいことは、クラスの定義と、実際に出力された内容が一致していないことである。前の例(SoapFormatterクラスによって生成されたXML文書)であれば、すべてのフィールドが、そのフィールドの名前の要素によって出力されていた。しかし、ここでは要素名は、フィールド名と一致しておらず(例えばフィールドm_nameが、Nameという要素名で出力されている)、しかも、すべてのフィールドが出力されているわけではない。
このような結果の相違は、もちろん、すでに述べたとおり、ISerializableインターフェイスを実装したことによって変化した出来事である。しかし、ただ単にISerializableインターフェイスを実装するだけでは、不十分であることにも注意しなければならない。実際、前回の最初のサンプル(サンプル・プログラム1-2:SoapFormatterクラスによりシリアライズするPersonクラス)のソース・コードと比較して、このクラスにはISerializableインターフェイスを実装するためのメソッドが1つ(GetObjectDataメソッド)と、さらにコンストラクタが2つ増えている。
Insider.NET 記事ランキング
本日
月間