Как уже упоминали другие, при передаче объектов в качестве параметров в метод RMI, объект сериализуется, а затем десериализуется на другом конце внутри целевого объекта, содержащего метод RMI. Это разрывает ссылку от переданных исходных объектов, поскольку теперь у вас есть два различных объекта: один в клиентском коде, вызывающем метод, и один на удаленной стороне.
В этом конкретном примере лучшим подходом будет разбить вызовы вашего метода (так как вы, кажется, делаете две вещи в одном методе: получение имен клиентов и получение номеров клиентов), и вместо этого ваши результаты скорее возвращаются вызывающей стороне. чем передать в коллекцию ... как это:
public ArrayList<String> getCustomerNames() throws java.rmi.RemoteException;
public ArrayList<String> getCustomerNumbers() throws java.rmi.RemoteException;
Поскольку и ArrayList, и String реализуют Serializable, результаты в коллекции будут сериализованы и отправлены по кабелю клиентскому коду, вызывающему метод, после чего вы можете работать с данными, как вам нужно. Если вместо этого вам нужно использовать пользовательский объект в коллекции, пока ваш класс реализует интерфейс java.io.Serializable и следует спецификации для этого интерфейса, у вас не должно возникнуть проблем.
Это приведет к двум отдельным вызовам по проводной линии, но это намного более чистое и простое взаимодействие и позволит избежать проблемы разрыва ссылок в вашем исходном примере.