ようこそ。睡眠不足なプログラマのチラ裏です。

Webサービスでクラス渡しを実現するためのメモ

System.Xml.Serialization.XMLSerializer や、
System.Runtime.Serialization.Formatters.Soap.SoapFormatter
というクラスがある。XMLSerializerはPublicなフィールドのみがシリアライズ対象となって、
SoapFormatterは基本的に全てのフィールドがシリアライズされる。
当然、シリアライズ対象のクラスはSerializable属性を指定する必要がある。


以下、適当なサンプルソース

[VB.NET]
'SoapFormatterによるシリアライズ
Public Function GetSerializeString(ByVal Obj As Object) As String
  Dim strm As New MemoryStream()
  Dim formatter As New Soap.SoapFormatter()
  formatter.Serialize(strm, Obj)
  strm.Flush()
  strm.Seek(0, SeekOrigin.Begin)
  Dim reader As New StreamReader(strm)
  Dim RetString as String = reader.ReadToEnd()
  reader.Close()
  strm.Close()
  Return RetString
End Function


'SoapFormatterによるデシリアライズ
Public Function GetDeserializeObject(ByVal StreamString As String) As Object
  Dim strm As New MemoryStream(System.Text.UTF8Encoding.UTF8.GetBytes(StreamString))
  Dim formatter As New Soap.SoapFormatter()
  Dim Obj as Object = formatter.Deserialize(strm)
  strm.Close()
  Return Obj
End Function


SoapFormatterでのシリアライズ/デシリアライズは、非常にお手軽なのだが、
以下のような欠点もある

1.Publicフィールド/プロパティ以外シリアル化できない(XMLSerializerの場合)。



2.Publicな引数無しのコンストラクタのあるクラスしかシリアル化できない。

3.Listの配列についてはシリアル化ができない。

4.デシリアライズ時にクラスのPublicフィールド/プロパティでXMLファイルに
  存在しないものはNull(Nothing)で上書きされてしまう。

5.ArrayListクラスや、配列(およびジャグ配列)のシリアル化も可能。しかし配列の型の派生クラスを持つ
  配列をシリアル化しようとすると、その配列に入りうる型をあらかじめ指定しなければならない。

  例えば、
  のように、属性を付加する必要がある。

というような感じで、欠点(というよりもむしろ使用上の注意)がある。
しかし、これだけの自由度の高さでこのお手軽さは素敵。
フォームの位置やサイズはIDEで簡単設定できるアプリケーション設定を使って、
アプリ独自の設定内容や保存データはXMLSerializerでシリアル化するのがよさげ。
それにしても、.NET環境のXMLへの親和性の高さは目を見張るものがありますな。