2012-01-24 16 views
3

私はJavaでシリアライゼーションについて少し学んだ。私の基本的な理解は、オブジェクトの状態を永続化してストリームに書き込むメカニズムであり、オブジェクトを作成していない他の「JVM」や後の時点で膨張させて使用できるということです。 クラスAを持ち、クラスAのインスタンス、つまりオブジェクトaを作成し、それをシリアル化してファイル "A.ser"に格納するとします。ファイルを他のシステムにコピーし、ファイル "A.ser"を非直列化して、オブジェクトの永続状態を取得します。しかし、その場合、Aのクラス定義は、オブジェクトを逆シリアル化する他のシステムに存在する必要があります。クラス定義を保存して他のシステムに転送する方法はありますか?そのため、クラス定義を取得してクラスを再構築するまで、他のJVMはクラスAが何であるか分かりません。java serialization - クラス定義を維持する

答えて

1

あなたが何を記述するかは、ClassLoaderです。クラスパスにAを持たないJVMでクラスAをロードできるようにするには、ClassLoaderを使用してクラス(およびその依存関係)をロードする必要があります。

ObjectInputSTreamは、クラスを解決するためにカスタムクラスローダに委譲する必要があります。

https://forums.oracle.com/forums/thread.jspa?threadID=1149865の最後の投稿を参照してください。春もsuch an ObjectInputStreamです。

0

デシリアライゼーションのために、クラスは必要ないと考えています。しかし、クラス定義を外してオブジェクトを実行することができないので、デシリアライゼーション後にはどうしますか?

それは、クラス定義が見つからない場合、逆シリアル化がClassNotFoundExceptionをスローする理由です。クラス定義をjarファイルとして配布できます。

+0

ありがとうございます – NINCOMPOOP

0

シリアル化されていない場合、クラスファイルを別々に保存し、依存関係も評価してバンドルする必要があります。

だから、あなたは、オブジェクトをシリアル化、それはの.classファイルだ見つけ、依存クラスを検出し、あなたはすべての依存関係が解決されて解決されるまで、あまりにも、オンとの彼らの .classファイルを見つける必要があります。

これは簡単な作業ではないので、クラスのjarファイルでこのことを送信してください。

0

1つの考え方は、受信システムがリモートregistryからクラス定義をダウンロードすることです。リフレクションを使用してクラスの名前を取得する必要があります。ちょうど推測、私はそれを試みたことはありません。

関連する問題