- PR -

Strignとバイト配列

投稿者投稿内容
ドナ
常連さん
会議室デビュー日: 2003/07/08
投稿数: 42
投稿日時: 2003-12-19 16:36
引用:

今行いたいのは
バイト配列 → Stringオブジェクト → バイト配列
の変換です。



以下のように変換したバイト配列をそれぞれ保存して
くらべたところ内容が同じでした。
コード:

ObjectOutputStream out = null;
String str = "Test";
byte[] data1 = str.getBytes();
out = new ObjectOutputStream(new FileOutputStream("hoge1.txt"));
out.writeObject(data1);

String s = new String(data1);

byte[] data2 = s.getBytes();
out = new ObjectOutputStream(new FileOutputStream("hoge2.txt"));
out.writeObject(data2);

s = new String(data2);
System.out.println(s);


このようなことでしょうか?上のプログラムだと
Stringオブジェクト→バイト配列→Stringオブジェクト→バイト配列→Stringオブジェクト
ということですよね、これでうまくいくのに

Nodeオブジェクト→バイト配列→Stringオブジェクト→バイト配列→Nodeオブジェクト

なぜうまくいかないのかまだわかりません
もう少しご教授いただけないでしょうか?

引用:

# ところでバイト配列をStringオブジェクトに変換するのは必要があってのことですか?
# serializeの戻り値と、deserializeの引数をバイト配列に変えるだけで問題は
# 解決しそうな気がするのですが...

# それと、serializeの引数のNodeはorg.w3c.dom.Nodeですか?
# DOMのシリアライズならjavax.xml.transform.Transformerを使うほうが
# 一般的だと思いますよ。


Nodeはorg.w3c.dom.Nodeです。
確かにバイト配列に変えるだけでうまくいきます。
卒研の内容でシリアライザーの組み込み方法について少し勉強していて、
その組み込む方法もまだ良くわかっていない状況なのですが、String型に
なおしたら簡単そうだったのでこのようなシリアライザーを作成することから
はじめました。


[ メッセージ編集済み 編集者: UK 編集日時 2003-12-19 16:38 ]

[ メッセージ編集済み 編集者: UK 編集日時 2003-12-19 16:39 ]
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 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");

としてやれば、上手くいくでしょう。

# 「文字列化」すること自体に意味はないと思いますが・・・

Astmild
常連さん
会議室デビュー日: 2003/06/09
投稿数: 30
お住まい・勤務地: 大田区
投稿日時: 2003-12-19 18:06
引用:
UKさんの書き込み (2003-12-19 16:36) より:
Stringオブジェクト→バイト配列→Stringオブジェクト→バイト配列→Stringオブジェクト
ということですよね、これでうまくいくのに

Nodeオブジェクト→バイト配列→Stringオブジェクト→バイト配列→Nodeオブジェクト

なぜうまくいかないのかまだわかりません
もう少しご教授いただけないでしょうか?

Wataさんのレスを2つとも読み直して考えてみてください。
その後で以下を読んでください。


シリアライズとは、メモリ上に置かれているオブジェクトを
入出力用に直列化することです。
当然、デシリアライズすれば元のオブジェクトに戻ります。
扱っているのはオブジェクトです。

次に、new String(byte[]) は、バイト配列の文字列から
Stringオブジェクトを生成します。
また、getBytes(java.lang.String)を行うとStringオブジェクトから
文字列をバイト配列で返します。
扱っているのは文字列です。

どちらもバイト配列にするのは同じですが、対象や方法が異なるため
java.io.StreamCorruptedException が発生するのです。
invalid stream header とも言ってますし。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2003-12-19 21:04
引用:

どちらもバイト配列にするのは同じですが、対象や方法が異なるため
java.io.StreamCorruptedException が発生するのです。


UKさんがなぜ混乱されているのかが分かりました。

XMLのオブジェクト(まあ普通はDOMでしょう)をテキスト文字列に変換することを、「XML(DOM)オブジェクトのシリアライズ」と呼ぶことがあるようです。私の知り合いもそう呼んでいました。(ただ、テキスト文字列からXML(DOM)オブジェクトへの「デシリアライズ」とは呼ばないようで、これは普通に「パース」と言っていましたね・・・)

ですが、Javaで言うところの「シリアライズ」は、メモリ上に展開されているオブジェクト(及びそこから参照されているオブジェクト)をバイト列に変換し、ファイルなどに書き出せる形にすることです。もしくは、バイト列をネットワーク越しに送りつけることも出来ます。「デシリアライズ」はその反対の概念で、「オブジェクトのシリアライズされた(ている筈の)バイト列をメモリ上のオブジェクトに変換する」処理です。

ここのところを混同されているのではないでしょうか?
ドナ
常連さん
会議室デビュー日: 2003/07/08
投稿数: 42
投稿日時: 2003-12-21 09:26
みなさんありがとうございました。
coasmさんの通りやると上手く行きました。
しかしもう少し調べてみます
勉強になりました

スキルアップ/キャリアアップ(JOB@IT)