いいえ、それは真実ではありません。ORBがローカルオブジェクトの最適化(「コロケーションされたオブジェクト」の場合もある)を実装している場合、ソケットは開かれませんが、シリアル化/逆シリアル化が実行されます。これは通常、マーシャリングよりも高速です。プログラミングモデルに違反しないように、余分なオブジェクトのコピーが作成されます。
生成されたスタブは、この最適化を可能にします。インターフェースの例を次に示します。
public interface a extends Remote {
public ArrayList test(ArrayList in1, ArrayList in2) throws RemoteException;
}
rmic -iiop-keepaの結果は次のとおりです。
public ArrayList test(ArrayList arg0, ArrayList arg1) throws java.rmi.RemoteException {
if (!Util.isLocal(this)) {
/* ... trim remote code ... */
} else {
ServantObject so = _servant_preinvoke("test",a.class);
if (so == null) {
return test(arg0, arg1);
}
try {
Object[] copies = Util.copyObjects(new Object[]{arg0,arg1},_orb());
ArrayList arg0Copy = (ArrayList) copies[0];
ArrayList arg1Copy = (ArrayList) copies[1];
ArrayList result = ((a)so.servant).test(arg0Copy, arg1Copy);
return (ArrayList)Util.copyObject(result,_orb());
} catch (Throwable ex) {
Throwable exCopy = (Throwable)Util.copyObject(ex,_orb());
throw Util.wrapException(exCopy);
} finally {
_servant_postinvoke(so);
}
}
}
スタブがローカルオブジェクトに接続されると、ObjectImpl._servant_preinvokeを呼び出して、同じJVM内でサーバント(この場合はEJBラッパー)を見つけます。次に、入力引数のコピーを作成し(マーシャリングをシミュレート)、メソッドを呼び出し、結果オブジェクトのコピーを作成します(ここでもマーシャリングをシミュレートします)。
私はWebLogicの専門家ではありません。とはいえ、このドキュメントは、WebLogicが併置されたオブジェクトの最適化を実行することを意味します。
http://download.oracle.com/docs/cd/E13222_01/wls/docs61/cluster/object.html#1007328