goo blog サービス終了のお知らせ 

いつもどこかでデスマーチ♪

不定期に、私の日常を書き込みしていきます。

.net の MemoryStream で失敗…

2012年10月22日 18時19分33秒 | メモ
FTPからXMLデータを取得して、XDocumentで解析させるプログラムを作ってます。

で、MemoryStream クラスからデータを取得する箇所でへんな事が起きました。

エラーメッセージ:"'.' (16 進数値 0x00) は無効な文字です。"(最後の行の最後の文字の部分)

ソースコード:
String readXml = Encoding.GetEncoding(932).GetString(memoryStream.GetBuffer());
result = XDocument.Parse(readXml);



何だ!?と思ってファイルを開いても何も問題なし。普通に読み込めます。
ためしに、ファイルをローカルにコピーしてファイルを読み込ませても問題無し…
えぇ!と思い、デバッグしてデータを虫眼鏡マークで表示させても問題があるようには見えない…

ふとマウスカーソルでツールチップが表示されたので、最後の方にカーソルを移動させると…

\0 のオンパレード…出るわ出るわ…
・・・\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0

コイツが原因かっ!!!!

で、ネットをあさってみると、英語のサイトばかり(笑)

結果、下記のように修正しました。
String readXml = Encoding.GetEncoding(932).GetString(memoryStream.ToArray());
result = XDocument.Parse(readXml);


ToArray() を使うことにより、\0 が付与される事が無くなりました。
こんなの.netのバグダロウッ!と言いたくなります。
味噌は、
ファイルの最後(改行コード)の部分でエラーが発生したとエラーメッセージが出る所です。


MemoryStream クラスで、GetBufferメソッドは使っちゃダメですっ!


ちなみに、必ずなるわけじゃなく、「なることがある」って事です。
ちなみに、こんなコード書かないでね♪
readXml.Replace("\0", string.Empty)


検索用:MemoryStream \0 無効な文字です。 GetBuffer


************** コメントへの返信 **************
遅くなりましたが返信してみたいと思います。

2013年8月16日 返信
> GetBuffer って名前なぐらいだし、その領域が実データサイズと一致してなくてもまったく不思議はないような。
> てか、ドキュメントにもしっかり書いてありますね。
> バグ呼ばわりはひどいな。

「こんなの.netのバグダロウッ!と言いたくなります。」
ドキュメントに書いてあるのも承知してます。
"言いたくなった"だけです。バグ呼ばわりしてません…

このように受け取られてしまったのは、私の文才が無いからですね。
今後気を付けます。

コメント (1)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« netsession_win.exe について | トップ | やっぱりVBAは好きになれない… »
最新の画像もっと見る

1 コメント

コメント日が  古い順  |   新しい順
Unknown (d)
2012-11-07 00:30:44
GetBuffer って名前なぐらいだし、その領域が実データサイズと一致してなくてもまったく不思議はないような。
てか、ドキュメントにもしっかり書いてありますね。
バグ呼ばわりはひどいな。
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

メモ」カテゴリの最新記事