0

shared.jarには、次のものがあります。

abstract class MyParent {

}
abstract class MyClass {
   MyParent getFoo();
}

server.jarには

abstract class MyChild extends MyParent {

}
abstract class MyClassConcrete {
   MyParent getFoo() {return new MyChild();}
}

client.jar

MyParent foo = myClass.getFoo();

3つのjarすべてが1つのクラスローダーにある場合、すべてが正常に機能します。

ただし、クライアントとサーバーは異なるJVMにあります。

  • JVM-1に含まれるもの:server.jarshared.jar
  • JVM-2に含まれるもの:client.jarshared.jar

クライアントがサーバーを呼び出します。サーバーはMyConcreteClassを返し、Javaはそれを逆シリアル化できません(ClassNotFoundException)。


私がしたいこと:

  • サーバーはクラスをシリアル化し、データとクラスの祖先のセットを送信します
  • クライアントは、逆シリアル化する可​​能性のある最も狭い祖先を見つけます。

そして、すべてが大丈夫です。クライアントにMyParentのインスタンスがあり、それが必要です。

そのようなエンジンがないなんて信じられません。知っていますか?リモートコールは、可能な限りローカルコールに似ている必要があります。

ありがとう。

4

2 に答える 2

0

実際に私は解決策を見つけ、それをサポートする特別なパッケージを作成しました:

  • MyParentは、特別なSerializableParentアノテーションでマークする必要があります。この注釈は、リモーティング エンジンが子クラスをシリアライズしてネットワーク経由で転送する前に、子クラスをMyParentに「変換」する必要があることを意味します。このアノテーションを設定することにより、MyParentがリモート JVM に存在することをシステムに伝えるだけでなく、階層ツリーがポリモーフィズムを必要としないこともわかります。子が親のメソッドをオーバーライドすると、リモート システムでは使用できなくなります。これは、データではなくコードのみが送信される可能性があるためです。
  • 結果エンジンを送信する前に、 SerializableParentとして注釈が付けられた最も狭い祖先を検索する必要があります
  • (XStream などを使用して) XML にシリアライズし、親クラスを子のエイリアスとして逆シリアライズする必要があるオブジェクト。「不明なフィールド」エラーを防ぐには、Xstream をハッキングして、wrapMappershouldSerializeMemberをオーバーライドする必要があります。
  • 転送する「シリアル化可能な親」を取得しました
于 2012-04-20T20:25:51.543 に答える
0

java.io.Serializable インターフェイスを実装するオブジェクトは、writeReplace() および readResolve() メソッドを使用して、シリアライズまたはデシリアライズされるオブジェクトを別のオブジェクトに置き換えることができます。これがあなたの問題に対処するために使用されていることがわかります。ただし、私はこれを自分で試したことはありません。

于 2012-04-23T19:50:28.370 に答える