2012-02-19 11 views
1

自己定義のserializableオブジェクトをネットワークソケット経由で送信し、反対側を逆シリアル化しようとしています。ここで私が送信したいクラスの定義は次のとおりです。Javaのクラスバイトコードにアクセスせずにオブジェクトを逆シリアル化する

public class Test implements implements Runnable, Serializable{ 
    public void run() { 
     System.out.println("Hello!"); 
    } 
} 

私はちょうどRunnableにそれをキャストすることによって、クラスbytecodeへのアクセスを持たずにもう一方の端には、このクラスを再構築したいです。残念ながら、それは私にClassNotFoundExceptionの例外を与えます。クラスbytecodeにアクセスせずにオブジェクトを逆シリアル化できる回避策はありますか?

+2

あなたが何を求めているか考えてみましょう。コードにアクセスすることなく、ネットワーク上でコードを転送して実行できるようにしたいと思っていますか? – tzaman

+0

これについて考える方法の1つは、ネットワーク上で ".class"ファイルを送信して、再度実行することです。 – Javad

+0

'.class'ファイルにはバイトコードが含まれていないと思いますか? – tzaman

答えて

1

お願いしていることはできません。

Javaシリアル化APIは、オブジェクト内のデータフィールドといくつかのハウスキーピング情報を送信します。データフィールドはコンパクトな形式で送信されます。受信側では、これらのデータフィールド値を使用してオブジェクトが構築されます。

通常はオブジェクトを作成し、コンストラクタでフィールドを初期化するときと同じように考えることができます。ここでJavaのシリアライゼーションはコンストラクタの仕事をしていますが、メソッドなどのバイトコードを含むクラス定義が必要です。

3

ただし、HTTPサーバー経由でjarsを提供し、java.rmi.server.codebaseシステム・プロパティーをRMIがクラスをロードするURLのリストに設定してクライアントを実行することができます。

0

ClassNotFound例外のメッセージからクラス名を取得できます。私はクラスが読み込まれることを必要とせずに、デシリアライズされたクラスからクラス名を取得するより良い方法があることを望みます。

関連する問題