2012-03-26 3 views
2

私は、クライアントのサーバーによってシリアル化される予定の多くのオブジェクトによって共有されるインターフェイスIを定義するプランを持っていました。考え方は、クライアントがインターフェイスを知っているだけで、Iの具体的な実装を知ることを心配する必要はありません。私のプロジェクトは、私がdeserializeするクラスの具体的な型を知っている必要がありますか?

問題は、デシリアライズ時にJavaがそのクラスパスで非直列化しようとしているクラスを見つけ出す必要があるように思われます。

代替手段はありますか?

答えて

1

クライアントのVMはどこで実装用のバイトコードを取得しますか?あなたが有線を介して具体的な実装クラスを送信し始める場合を除き、このアプローチはうまくいきません。クライアントは具体的な実装が必要になります。

4

はい、クライアントはクラスパスに具体的な実装が必要です。一般に、すべての実装をクライアントjarに含めるのが最も簡単です。いくつかの極端な状況では、実装をオンザフライでロード可能にすることが理にかなっています。この場合、rmiのリモートクラスローディング機能を使用できます(これはセットアップには非常に面倒で、努力に値するものではありません)。

0

これは、クラスが機能の仕方で実装しなければならないものです。

クラスがデータを含むBeanに過ぎない場合、クライアント・コードはASMおよび動的な実行時バイトコード操作の他の手法を調べることができます。私が最近使った良い例は、JacksonのMr Beanでした。それは、オンザフライで豆全体を作成するための非常に単純なインタフェースが必要です。

クラスに実際の機能を必要とし、この機能がクライアントにない場合は、クラスをシリアル化して、ワイヤを送信して、おそらく何らかのカスタムを行う必要があると思いますデシリアライズされたデータからクラスをロードできるクラスローダーです。