- - PR -
Strignとバイト配列
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-12-19 16:36
以下のように変換したバイト配列をそれぞれ保存して くらべたところ内容が同じでした。
このようなことでしょうか?上のプログラムだと Stringオブジェクト→バイト配列→Stringオブジェクト→バイト配列→Stringオブジェクト ということですよね、これでうまくいくのに Nodeオブジェクト→バイト配列→Stringオブジェクト→バイト配列→Nodeオブジェクト なぜうまくいかないのかまだわかりません もう少しご教授いただけないでしょうか?
Nodeはorg.w3c.dom.Nodeです。 確かにバイト配列に変えるだけでうまくいきます。 卒研の内容でシリアライザーの組み込み方法について少し勉強していて、 その組み込む方法もまだ良くわかっていない状況なのですが、String型に なおしたら簡単そうだったのでこのようなシリアライザーを作成することから はじめました。 [ メッセージ編集済み 編集者: UK 編集日時 2003-12-19 16:38 ] [ メッセージ編集済み 編集者: UK 編集日時 2003-12-19 16:39 ] | ||||||||||||
|
投稿日時: 2003-12-19 17:22
動作環境が書いてないのでデフォールトの文字エンコーディングが何かわかりませんが、
バイト配列 → Stringオブジェクトの処理で、バイト配列の中にEUC/MS932としてあり得ない バイト並び(2バイトコードの1バイト目の後に、2バイト目になりえないバイトがある等) が含まれていると、データが化けます。 で、それをバイト配列に戻しても元通りにはならないので、ObjectInputStreamとして読もう としても途中でエラーになってしまうわけです。 バイト配列 → Stringオブジェクトの所を String str = new String(data, "ISO8859_1"); Stringオブジェクト → バイト配列のところを Byte data = str.getBytes("ISO8859_1"); としてやれば、上手くいくでしょう。 # 「文字列化」すること自体に意味はないと思いますが・・・ | ||||||||||||
|
投稿日時: 2003-12-19 18:06
その後で以下を読んでください。 シリアライズとは、メモリ上に置かれているオブジェクトを 入出力用に直列化することです。 当然、デシリアライズすれば元のオブジェクトに戻ります。 扱っているのはオブジェクトです。 次に、new String(byte[]) は、バイト配列の文字列から Stringオブジェクトを生成します。 また、getBytes(java.lang.String)を行うとStringオブジェクトから 文字列をバイト配列で返します。 扱っているのは文字列です。 どちらもバイト配列にするのは同じですが、対象や方法が異なるため java.io.StreamCorruptedException が発生するのです。 invalid stream header とも言ってますし。 | ||||||||||||
|
投稿日時: 2003-12-19 21:04
UKさんがなぜ混乱されているのかが分かりました。 XMLのオブジェクト(まあ普通はDOMでしょう)をテキスト文字列に変換することを、「XML(DOM)オブジェクトのシリアライズ」と呼ぶことがあるようです。私の知り合いもそう呼んでいました。(ただ、テキスト文字列からXML(DOM)オブジェクトへの「デシリアライズ」とは呼ばないようで、これは普通に「パース」と言っていましたね・・・) ですが、Javaで言うところの「シリアライズ」は、メモリ上に展開されているオブジェクト(及びそこから参照されているオブジェクト)をバイト列に変換し、ファイルなどに書き出せる形にすることです。もしくは、バイト列をネットワーク越しに送りつけることも出来ます。「デシリアライズ」はその反対の概念で、「オブジェクトのシリアライズされた(ている筈の)バイト列をメモリ上のオブジェクトに変換する」処理です。 ここのところを混同されているのではないでしょうか? | ||||||||||||
|
投稿日時: 2003-12-21 09:26
みなさんありがとうございました。
coasmさんの通りやると上手く行きました。 しかしもう少し調べてみます 勉強になりました | ||||||||||||
