- PR -

Strignとバイト配列

投稿者投稿内容
ドナ
常連さん
会議室デビュー日: 2003/07/08
投稿数: 42
投稿日時: 2003-12-19 10:46
お世話になります。UKです。

勉強のためシリアライザーを作成試みました。
バイト配列にシリアライズして元に戻すことはできるのですが
そのバイト配列をStringにしてそれから復元することをしたい
のですがデシリアライズでエラーがでます.

未熟者で申し訳ありませんが、どなたかご教授宜しくお願いします
コード:

static String serialize(Node node){
try{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.reset();
oos.writeObject(node);
oos.flush();
byte[] data = baos.toByteArray();
String str = new String(data);
return str;
}catch(Exception ex){
System.out.println(ex);
}
return null;
}
static Node deserialize(String s){
try{
byte[] b = s.getBytes(s);
ByteArrayInputStream bais = new ByteArrayInputStream(b);
ObjectInputStream ois = new ObjectInputStream(bais);
Node node = (Node)ois.readObject();
return node;
}catch(Exception ex){
System.out.println(ex);
}
return null;
}





[ メッセージ編集済み 編集者: UK 編集日時 2003-12-19 14:10 ]
ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 2003-12-19 11:39
エラーの内容を投稿した方が、レスを付け易くなりますよ。

※後、コードタグ([code])を使用して、インデントをつけると更に良。
ドナ
常連さん
会議室デビュー日: 2003/07/08
投稿数: 42
投稿日時: 2003-12-19 12:23
ぽんさん、すみません。
エラーではなくnullが返ってきます
ぽん
大ベテラン
会議室デビュー日: 2003/05/13
投稿数: 157
投稿日時: 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/06/10
投稿数: 103
お住まい・勤務地: 大阪市淀川区西中島4-13-22 新大阪淀川ビル5F
投稿日時: 2003-12-19 12:51
こんにちは。米山@クロノスです。

ぽんさんがおっしゃるようにgetBytes()メソッドで例外が発生しているのではないでしょうか? APIドキュメントを確かめてみてください。sがどのような文字列かわかりませんが、UnsupportedEncodingExceptionは発生してませんか?
実行環境がないので確かめてませんが。
で、nullがreturnされているのかと。。。

デバッグ時には例外をprintStackTrace()したほうがわかりやすいと思いますよ。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 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/07/08
投稿数: 42
投稿日時: 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 ]
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-12-19 14:51
引用:

UKさんの書き込み (2003-12-19 14:07) より:
米山@クロノス様の指摘通りに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はjava.io.StreamCorruptedExceptionです。これを見れば、ストリームの内容(バイト配列)に問題があったことがわかると思います。


引用:

再度APIドキュメントを確認しStringとバイト配列の変換のみを確かめましたが

  String str = "Test";
  byte[] data = str.getBytes();
  String s = new String(data);
  System.out.println(s);

でちゃんと表示できました。


これでは、今必要な確認にはなっていないですよ。
今行いたいのは
バイト配列 → Stringオブジェクト → バイト配列
の変換です。

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

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

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