.net の MemoryStream で失敗…

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のバグダロウッ!と言いたくなります。」
ドキュメントに書いてあるのも承知してます。
"言いたくなった"だけです。バグ呼ばわりしてません…

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

コメント

このブログの人気の投稿

ヨドバシカメラの店舗購入履歴を見るには…

C# の WPF の DataGrid で 行を交互に背景色を変える+選択色を変える+カラムが無い所も変える…

Visual Studio の ホットリロードが動かない場合に確認するところ