« SB、自前回線じゃPCデータ定額は無理宣言? | トップページ | 1,000fpsのハイスピード動画撮影が可能なコンデジ »

2009年2月11日 (水)

[VB.NET]オブジェクトの逆シリアル化で空白や改行を再現する

XmlSerializerクラスの、オブジェクトのプロパティをXMLドキュメントとして保存する「シリアル化」、そこから復元してくれる「逆シリアル化」はiniファイル代わりになって結構便利だったりします。

しかし、String型のプロパティの値に空白や改行が含まれている状態で単純に逆シリアル化をすると空白や改行除去されてしまいます。

シリアル化されたXMLドキュメントを確認すると空白や改行が含まれているんですが、逆シリアル化の際に除去されているよーです。

原因はXmlSerializerクラスのDeserializeメソッドが、XmlDocumentクラスのPreserveWhitespaceプロパティがFalseに相当する方法でXMLドキュメントを読み込むからです。

しかし、XmlSerializerクラスにはPreserveWhitespaceプロパティ相当するプロパティが存在しません。
そこで、XmlDocumentクラスを利用してXMLドキュメントを読み込み、XmlReader経由で逆シリアル化を行う事で、空白や改行を有効なまま逆シリアル化を行う事ができます。

PreserveWhitespaceプロパティは本来空白のために用意されているんですが、改行も再現してくれるよーです。
(おそらく除去をしないで、そのまま要素の内容をスルーさせてるんだと思う)

つーか、単純に逆シリアル化出来るよーに、XmlSerializerクラスのSerializeメソッドが、シリアル化する際に自動的にエンコードしてくれても良いよーな気がするんですが、どーなんでしょ?(^^;A

具体的なコードは以下の通りとなります

''' <summary>
''' 設定をファイルから読み込む
''' </summary>
''' <param name="clsACC">AppConfigClass</param>
Public Shared Sub ReadConfig(ByRef clsACC As AppConfigClass)

    'XmlSerializerオブジェクトの作成
    Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(AppConfigClass))

    '空白・改行コードを維持するためにPreserveWhitespaceを有効にする
    Dim doc As New System.Xml.XmlDocument()
    doc.PreserveWhitespace = True

    'XmlReaderを使って読み込んで逆シリアル化
    doc.Load("hogehoge.xml")
    Using reader As New System.Xml.XmlNodeReader(doc.DocumentElement)
        Dim o As Object = serializer.Deserialize(reader)
        clsACC = DirectCast(o, AppConfigClass)
    End Using

End Sub

ReadConfigプロシージャの引数に逆シリアル化するクラスのインスタンスを指定して呼び出すと、インスタンスの内容をXMLドキュメント「hogehoge.xml」から取得して復元してくれます。

|

« SB、自前回線じゃPCデータ定額は無理宣言? | トップページ | 1,000fpsのハイスピード動画撮影が可能なコンデジ »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/26493/27972670

この記事へのトラックバック一覧です: [VB.NET]オブジェクトの逆シリアル化で空白や改行を再現する:

« SB、自前回線じゃPCデータ定額は無理宣言? | トップページ | 1,000fpsのハイスピード動画撮影が可能なコンデジ »