DOBON.NET DOBON.NETプログラミング掲示板過去ログ

xmlSerializerについて

環境/言語:[Win2k VB.NET]
分類:[.NET]

xmlSerializerにて下記のクラスをシリアライズし、さらにデシリアライズで元に戻して見ました。

public class Test
public txt as string
end class

Testクラスのtxtには「"あいうえお" & vbclrf & "かきくけこ"」と入れてテストしました。
シリアライズ後のファイルは問題なかったのですが、デシリアライズした時のtxtには
「"あいうえお" & vblf & "かきくけこ"」が入っており、そのままテキストボックス等に
入れると改行されませんでした。
Replace(vblf,vbcrlf)にて現在は対応しているのですが、なぜ改行コードが換わってしまうのでしょうか?
■No21530に返信(SIRさんの記事)
> xmlSerializerにて下記のクラスをシリアライズし、さらにデシリアライズで
>元に戻して見ました。
> Replace(vblf,vbcrlf)にて現在は対応しているのですが、なぜ改行コードが換わ>ってしまうのでしょうか?

何故という答えにはなっておりませんが・・・

通常、Windowsで改行とは「CR + LF」という2つの記号の組合せですが
LFのみをもって改行とする世界も存在しています。

もしかしたら、StreamReaderがなんらかの悪さをしているかも知れません。
文字コードがEUC-JPであると
改行コードがWindowsで一般的なCRLF(\r\n)ではなく、
LF(\n)のみだそうです。
お返事ありがとうございます。

使用している文字コードはEUC-JPではなく、UTF-8やShift-JISなのですが、
どちらにしろ改行コードが換わってしまう様です。

実際のコードは下記の通りです。

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim Enc As Encoding = Encoding.GetEncoding("UTF-8")
Dim Serializer As XmlSerializer = New XmlSerializer(GetType(Test))
Dim Writer As StreamWriter = New StreamWriter("C:\Test.xml", False, Enc)
Dim T As New Test
T.txt = "あいうえお" & vbCrLf & "かきくけこ"

Serializer.Serialize(Writer, T)
Writer.Close()

T.txt = ""

Dim Reader As StreamReader = New StreamReader("C:\Test.xml", Enc)
T = Serializer.Deserialize(Reader)
Reader.Close()

Me.TextBox1.Text = T.txt.Replace(vbLf, vbCrLf)

End Sub

Public Class Test
Public txt As String
End Class

不思議なのは、ただ単にStreamReaderのみでファイルを読み込んだ場合は
改行コードはCRLFなのですが、
XmlSerializerを通した場合はCrが抜けてしまうということです。
(Test.xmlの中身はCRLFで改行されていることを確認しています)

出来れば原因を知りたいのですが、現在のReplaceで問題ないのならこのままでも
良いのかなとも思っております。
■No21535に返信(SIRさんの記事)
> XmlSerializerを通した場合はCrが抜けてしまうということです。

XMLのDeserializeで空白(改行)が削除される
http://www.spoon.mydns.jp/blog/archives/2005/11/xmldeserialize.html
やじゅさん、ありがとうございます。
提示していただきました下記URLを参照しました。
> XMLのDeserializeで空白(改行)が削除される
> http://www.spoon.mydns.jp/blog/archives/2005/11/xmldeserialize.html

なるほど、xmlの仕様だったんですね。まったく知りませんでした。
また、対処法も載っていて、VB.NETにて直して使用してみた所希望通りの
動作を行うことを確認致しました。

改めて、本当にありがとうございました。
解決済み!
  • 題名: Re[6]: xmlSerializerについて
  • 著者: やじゅ
  • 日時: 2008/02/29 9:17:29
  • ID: 21539
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No21537に返信(SIRさんの記事)

参照リンクだと消えてしまう可能性があるので転記

XMLの仕様として通常は空白(+改行)を削除されるため、
XmlDocumentにはPreserveWhitespaceプロパティをtrueに設定
にすることにより、空白は保持された状態にできます。

XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.LoadXml(s);
XmlNodeReader reader = new XmlNodeReader(doc.DocumentElement);
Source src = (Source)new XmlSerializer(typeof(Source)).Deserialize(reader);
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板