No, no es verdad. Si el ORB implementa la optimización de objetos locales (a veces "objetos coubicados"), no abrirá ningún socket, pero realizará la serialización/deserialización, que suele ser más rápido que ordenar. Las copias de objetos adicionales están hechas para evitar violar el modelo de programación.
Los stubs generados permiten esta optimización. Aquí es una interfaz ejemplo:
public interface a extends Remote {
public ArrayList test(ArrayList in1, ArrayList in2) throws RemoteException;
}
Este es el resultado de rmic -iiop -keep a:
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);
}
}
}
Cuando un trozo está conectada a un objeto local, llama ObjectImpl._servant_preinvoke para localizar una sirviente (un contenedor EJB en su caso) dentro de la misma JVM. A continuación, realiza una copia de los argumentos de entrada (simulando la clasificación), llama al método y realiza una copia del objeto de resultado (simulando de nuevo la clasificación).
No soy un experto de WebLogic. Dicho esto, este documento implica que WebLogic realiza la optimización de objeto coubicado:
http://download.oracle.com/docs/cd/E13222_01/wls/docs61/cluster/object.html#1007328