- - PR -
Strignとバイト配列
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-12-19 10:46
お世話になります。UKです。
勉強のためシリアライザーを作成試みました。 バイト配列にシリアライズして元に戻すことはできるのですが そのバイト配列をStringにしてそれから復元することをしたい のですがデシリアライズでエラーがでます. 未熟者で申し訳ありませんが、どなたかご教授宜しくお願いします
[ メッセージ編集済み 編集者: UK 編集日時 2003-12-19 14:10 ] | ||||||||
|
投稿日時: 2003-12-19 11:39
エラーの内容を投稿した方が、レスを付け易くなりますよ。※後、コードタグ([code])を使用して、インデントをつけると更に良。 | ||||||||
|
投稿日時: 2003-12-19 12:23
ぽんさん、すみません。
エラーではなくnullが返ってきます | ||||||||
|
投稿日時: 2003-12-19 12:46
シリアライズについてはあまり良く知らないので確かな事は言えないのですが、
根本的に何かが違うような・・・ サンプルページ http://www.asahi-net.or.jp/~ge3m-hsmt/mPages/jap/serialize.html 取り合えず >byte[] b = s.getBytes(s); は byte[] b = s.getBytes(); だと思います。 | ||||||||
|
投稿日時: 2003-12-19 12:51
こんにちは。米山@クロノスです。
ぽんさんがおっしゃるようにgetBytes()メソッドで例外が発生しているのではないでしょうか? APIドキュメントを確かめてみてください。sがどのような文字列かわかりませんが、UnsupportedEncodingExceptionは発生してませんか? 実行環境がないので確かめてませんが。 で、nullがreturnされているのかと。。。 デバッグ時には例外をprintStackTrace()したほうがわかりやすいと思いますよ。 | ||||||||
|
投稿日時: 2003-12-19 13:31
提示されているプログラムで明らかにおかしいのは
serializeメソッドの > byte[] data = baos.toByteArray(); > String str = new String(data); の部分と、みなさんも指摘している > byte[] b = s.getBytes(s); の部分です。メソッド、コンストラクタの使用方法として間違っています。 自分の知らないクラスやメソッドなどを使うときは(少なくとも上手くいかないときは)、まずAPIドキュメントを確認するようにしてください。メソッドの意味や、引数や戻り値の説明、発生しうる例外の説明がかかれています。 今回の件で関連するのは
です。 #追伸 それとぽんさんもしてきしているように、ソースを載せるときはなるべくコードタグを使ってださい。メッセージの下の のアイコンをクリックすれば、書き込んだメッセージを修正できるので、タグをつけておけば見やすくなると思いますよ。
[ メッセージ編集済み 編集者: Wata 編集日時 2003-12-19 13:36 ] [ メッセージ編集済み 編集者: Wata 編集日時 2003-12-19 13:40 ] | ||||||||
|
投稿日時: 2003-12-19 14:07
UKです。
みなさんにご指摘いただいた byte[] b = s.getBytes(s); が byte[] b = s.getBytes(); ですが自分が間違ったソースを掲載してしまっていました。実際は byte[] b = s.getBytes(); と書いています。2度とこのようなミスはしないように以後気をつけます 申し訳ありません。 米山@クロノス様の指摘通りにprintStackTrace()を使用した結果 エラーが以下のように出ました java.io.StreamCorruptedException: invalid stream header at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:737) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:253) at SerializerTest.deserialize(SerializerTest.java:44) at SerializerTest.main(SerializerTest.java:15) 再度APIドキュメントを確認しStringとバイト配列の変換のみを確かめましたが String str = "Test"; byte[] data = str.getBytes(); String s = new String(data); System.out.println(s); でちゃんと表示できました。 [ メッセージ編集済み 編集者: UK 編集日時 2003-12-19 14:08 ] | ||||||||
|
投稿日時: 2003-12-19 14:51
これで一歩先に進むことができましたね。 そこで次に調べるべきAPIはjava.io.StreamCorruptedExceptionです。これを見れば、ストリームの内容(バイト配列)に問題があったことがわかると思います。
これでは、今必要な確認にはなっていないですよ。 今行いたいのは バイト配列 → Stringオブジェクト → バイト配列 の変換です。 # ところでバイト配列をStringオブジェクトに変換するのは必要があってのことですか? # serializeの戻り値と、deserializeの引数をバイト配列に変えるだけで問題は # 解決しそうな気がするのですが... # それと、serializeの引数のNodeはorg.w3c.dom.Nodeですか? # DOMのシリアライズならjavax.xml.transform.Transformerを使うほうが # 一般的だと思いますよ。 | ||||||||

のアイコンをクリックすれば、書き込んだメッセージを修正できるので、タグをつけておけば見やすくなると思いますよ。