【问题标题】:Pass by reference not returning in RMI for ArrayListArrayList 的 RMI 中不返回引用传递
【发布时间】:2010-09-10 05:59:01
【问题描述】:

我有一个 RMI 调用定义为:

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

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

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

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

【问题讨论】:

  • 这里没有“引用”。参数和结果在 RMI 中按值传递,除非它们是导出的远程对象。

标签: java arraylist rmi


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-20
          • 2013-08-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-10
          相关资源
          最近更新 更多