0

我有一个 RMI 调用定义为:

public void remoteGetCustomerNameNumbers(ArrayList<String> customerNumberList, ArrayList<String> customerNameList) throws java.rmi.RemoteException;

该函数执行数据库查找并填充两个 ArrayList。调用函数一无所获。我相信这适用于 Vector 类型。

我是否需要使用 Vector,或者有没有办法在不打两个电话的情况下让它工作。我还有一些可能会使用的其他想法,比如返回一个键/值对,但我想知道我是否可以让它工作。

更新:
如果可以的话,我会接受到目前为止给出的所有答案。我不知道网络成本,因此重新编写函数以返回 LinkedHashMap 而不是两个 ArrayList 是有意义的。

4

4 回答 4

2

RMI 中的参数调用序列化。服务器上的反序列化创建列表的副本。如果列表保留在客户端,那么网络调用的数量会非常高。您可以传递远程对象,但要注意性能影响。

于 2008-09-17T16:45:01.627 回答
1

当您拨打远程电话时,您会丢失您的参考资料。您需要返回列表,而不是期望它们被远程调用填充。

于 2008-09-17T16:37:55.637 回答
1

正如汤姆所提到的,您可以传递远程对象。您必须创建一个类来保存实现 Remote 的列表。每当您将实现 Remote 的东西作为参数传递时,只要接收方使用它,它就会转身并对调用者进行远程调用使用该对象。

于 2008-09-17T18:47:26.777 回答
1

正如其他人已经提到的,当将对象作为参数传递给 RMI 方法时,对象将被序列化,然后在包含 RMI 方法的目标对象内的另一端反序列化。这会破坏传入的原始对象的引用,因为您现在有两个不同的对象:一个在调用该方法的客户端代码中,一个在远程端。

在这个特定示例中,更好的方法是分解您的方法调用(因为您似乎在一个方法中做两件事:获取客户姓名和获取客户编号),而是将结果返回给调用者而不是传入一个集合......像这样:

public ArrayList<String> getCustomerNames() throws java.rmi.RemoteException;

public ArrayList<String> getCustomerNumbers() throws java.rmi.RemoteException;

由于 ArrayList 和 String 都实现了 Serializable,因此集合中的结果将被序列化并通过线路发送到调用该方法的客户端代码,此时您可以根据需要处理数据。相反,如果您需要在集合中使用自定义对象,只要您的类实现 java.io.Serializable 接口,并遵循该接口的规范,您应该没有问题。

这将导致通过线路进行两次单独的调用,但交互更加清晰和简单,并且避免了原始示例中的引用中断问题。

于 2008-09-17T19:43:04.693 回答