たとえば、クライアントにインターフェイスのみを提供し、実装が特定のコードベースに配置されるとします。次に、クライアントはサーバーに特定のオブジェクトを送信するように要求します。クライアントは特定のインターフェイスを実装するオブジェクトを受信することを期待しますが、実際の実装はクライアントには不明です。送信されたオブジェクトを逆シリアル化するときは、コードに移動する必要があります。渡される実際のオブジェクトに対応する実装クラスをベースにしてダウンロードします。
これにより、クライアントが非常に薄くなり、すべてのクライアントを更新することなく、コードベースのクラスを非常に簡単に更新できます。
編集
次のインターフェイスを備えたRMIサーバーがあるとします。
public interface MiddleEarth {
public List<Creature> getAllCreatures();
}
クライアントにはとのインターフェイスのみがありMiddleEarth
、Creature
クラスパスの実装はありません。
の実装がタイプ、、、およびCreature
のシリアル化可能なオブジェクトである場合。また、これらの実装はコードベースにありますが、クライアントのクラスパスにはありません。Elf
Man
Dwarf
Hobbit
RMIサーバーに中つ国のすべてのクリーチャーのリストを送信するように依頼すると、RMIサーバーCreature
は、上記のクラスのいずれかを実装するオブジェクトを送信します。
クライアントがシリアル化されたオブジェクトを受信すると、それらを逆シリアル化するためにクラスファイルを探す必要がありますが、これらはローカルクラスパスにありません。このストリーム内のすべてのオブジェクトは、欠落しているクラスを探すために使用できる特定のコードベースでタグ付けされています。したがって、クライアントはこれらのクラスを探すためにコードベースに頼ります。そこで、使用されている実際のクリーチャークラスが見つかります。
コードベースは両方向で機能するため、サーバーにCreature
(つまりEnt
)を送信すると、コードベースでもサーバーが検索されます。
これは、クライアントとサーバーの両方が新しいタイプのクリーチャーを公開する必要がある場合creaturesImpl.jar
、コードベースでを更新するだけで、サーバーまたはクライアントアプリケーション自体では何も更新しないことを意味します。