- PR -

直列化されたオブジェクトの復元エラーに関して。

1
投稿者投稿内容
ゆう
常連さん
会議室デビュー日: 2001/12/10
投稿数: 33
投稿日時: 2004-04-24 15:07
いつもお世話になっております。

現在Weblogic8.1+StrutsでWebシステムの開発を行っています。
レガシーシステムとの送受信を行っていて
java.io.StreamCorruptedExceptionが発生して困っております。

実際のソースは持ち出せなかったので
送信データに対する受信データ(byte配列)から
オブジェクトの復元を行っているようでした。

試しにObjectInputStreamを生成する様なコードを以下に作成し、
実行してみましたが結果は同じでした。
よく分からないのですが、シリアライズされていないからでしょうか?
もしそうだとしたらどのようにテストすれば上手くいくかをご助言ください。

########------ TestClass FROM------########
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

/*テストクラス*/
public class TestStream {

public static void main(String[] args) {
String test = "test";
try{
ByteArrayInputStream bStream= new ByteArrayInputStream(test.getBytes());
ObjectInputStream oStream =new ObjectInputStream(bStream);
}catch(IOException e){
e.printStackTrace();
}
}
}
########------ TestClass TO------########

########------ StackTrace FROM------########
java.io.StreamCorruptedException: invalid stream header
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at TestStream.main(TestStream.java:12)
########------ StackTrace TO------########


########------ 環境------########
クライアント/サーバOS:Soralis8
JDK:1.4.1
----なお上記テストはWindows2000上で実行しました。

分かりにくい説明かと思いますが、
何かしらヒントになるようなことがお分かりの方がいらっしゃいましたら
ご教授ください。

なお同様のメッセージをJAVA-HOUSE-MLの方にも投稿しておりますので
何か分かりましたらお伝えします。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-04-24 15:36
ゆうさん、こんにちは。

問題なのは、レガシーシステムとの通信ですね?

そのシステムは Javaではないのではないでしょうか?
だとすれば、ObjectInputStreamではデータは復元できないでしょう。

まず、そのシステムの通信仕様を知る必要があります。
その当時の仕様書があれば良いのですが、なければソースから
リバースすることになります。
(「ソースが持ち出せない」というのが気になりますが。)

あと、実際の通信を観測してデータフォーマットを知ることも
ある程度できるかも知れませんが、それが完全であることを
保証することは出来ないと思いますから、業務用のシステム
ではお勧めできません。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-04-24 17:24
unibon です。こんにちわ。

引用:

ゆうさんの書き込み (2004-04-24 15:07) より:
現在Weblogic8.1+StrutsでWebシステムの開発を行っています。
レガシーシステムとの送受信を行っていて
java.io.StreamCorruptedExceptionが発生して困っております。


ふと気になったのですが、どんな点がレガシーなのでしょうか。

引用:

ゆうさんの書き込み (2004-04-24 15:07) より:
実際のソースは持ち出せなかったので
送信データに対する受信データ(byte配列)から
オブジェクトの復元を行っているようでした。


すでに byte の配列をお持ちでしたら、もし可能ならばですが、その内容の一部(またはそれほど多くなければ全部)を16進ダンプなどで提示されてはどうでしょうか。

引用:

ゆうさんの書き込み (2004-04-24 15:07) より:
String test = "test";
try{
ByteArrayInputStream bStream= new ByteArrayInputStream(test.getBytes());
ObjectInputStream oStream =new ObjectInputStream(bStream);
}catch(IOException e){
e.printStackTrace();
}


このコードだと "test" という文字列そのものをデシリアライズの入力にしていますが、シリアライズしていないものをデシリアライズすることはできません。
コガちゃん
会議室デビュー日: 2003/12/13
投稿数: 10
投稿日時: 2004-04-25 15:10
ObjectInputStreamで読み込める情報は、ObectOutputStreamで書き込んだ情報と同じフォーマットになってないといけないですよね。TestStreamクラスは根本的に使い方を誤っているような気がします。
私もStreamCorruptedExceptionで悩まされたことがあります。その原因は
『ObjectOutputStreamは追加保存する時にもヘッダ情報を書き出すため、ファイルの中に必要ないヘッダが紛れ込む』ことでした。
その時は、最初の書き込みはObjectOutputStreamを使い、2回目以降の書き込みには下記のクラスを利用して解消しました。
コード:
import java.io.*;
class NonHeaderObjectOutputStream extends ObjectOutputStream {
	protected void writeStreamHeader() {
	}

	NonHeaderObjectOutputStream(OutputStream out) throws IOException{
		super(out);
	}
}



全然違う原因だったらごめんなさい。
1

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