0

クラスGhostを正常にシリアル化しました。

class Ghost {}

File file = new File("serialized.class.bin");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(Ghost.class);

次に、別のアプリケーションで復元しようとしています。

InputStream is = new FileInputStream(new File("serialized.class.bin"));
ObjectInputStream ois = new ObjectInputStream(is);
Object o = ois.readObject();

そして、ロード中にクラスが見落とされるというエラーが発生します。

java.lang.ClassNotFoundException: Ghost

Ghost.classクラスの逆シリアル化中にファイルにアクセスできない場合があります。そのような方法でJavaクラスを転送することは可能ですか?

UPD。クラスのシリアル化中にクラス定義(バイトコード)がダンプされていると仮定しました。私は間違っていた。ただし、 getResourceAsStream()を介して目標に到達できます。

4

6 に答える 6

5

オブジェクトをシリアル化するClassと、クラス名への参照が格納されるだけで、実際にはクラスのバイトコードは格納されません (実際にはそれよりも少し複雑ですが、効果は同じです)。デシリアライゼーション時に、ObjectInputStreamは独自のクラスローダーから名前でクラスをロードしようとするため、そのクラスローダーを介してクラスにアクセスできる必要があります。

于 2012-11-27T12:56:42.450 に答える
3

デシリアライズされた形式にはクラスの非一時的非静的フィールドの値しか含まれていないため、クラスをデシリアライズするときは、クラスパスにクラスファイルを含める必要があります。

于 2012-11-27T12:53:30.957 に答える
0

シリアライズされたオブジェクトをデシリアライズするときは、オブジェクトのクラスがクラスパスにある必要があります。

このコンテキストでは、ClassNotFoundException必要なクラスがクラスパスにないことを意味する可能性が最も高いです。逆シリアル化を機能させるには、これに対処する必要があります。

于 2012-11-27T12:55:14.927 に答える
0

クラスであるため、データを含まないクラスをシリアライズしようとしています。クラスを送信する場合は、.class ファイルのバイトを送信し、クラスローダーでロードします。
シリアライズの目的は、オブジェクトをバイトに変換し、元に戻すことです。

于 2012-11-27T12:56:49.610 に答える
0

ストリームの一方の端から別の端にクラスを送信する場合は、.classファイル自体をストリームにプッシュしてファイルに保存し、ClassLoader装置を使用してそれを JVM にロードすることができます。JVMのバージョンなどに関して、これがどれほど移植性があるかはわかりません。

于 2012-11-27T13:57:55.553 に答える
0

クラス ファイルがクラス パスにないクラスをロードする場合は、ClassLoader.defineClassを使用する必要があります。そのメソッドにパラメーターとして渡されるバイト配列には、クラス ファイルの内容が含まれている必要があります (シリアル化されたクラス オブジェクトではありません)。

于 2012-11-27T12:58:08.403 に答える