Получение java.rmi.UnmarshalException: нераспознанный хэш метода: метод не поддерживается удаленным объектом

Я новичок в технологии RMI.

Когда я запускаю клиентскую программу rmi, я получаю исключение: java.rmi.UnmarshalException: нераспознанный хэш метода: метод не поддерживается удаленным объектом. Я использую jdk1.5

Аргументом удаленного метода является сериализованный объект.

Это код сервера...

Это удаленный интерфейс

package interfacepackage;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface ServerInterface extends Remote{

     public void getOrder(Order order) throws RemoteException;
}

Это класс реализации сервера

public class ServerImplementation implements ServerInterface {
    public ServerImplementation() throws RemoteException {
    }

    public void getOrderFromCash(Order order) throws RemoteException {
        System.out.println("WORKED");
    }
public static void main(String[] args) 

        try {
            java.rmi.registry.LocateRegistry.createRegistry(1234);
            ServerImplementation service = new ServerImplementation();
            ServerInterface myRemoteObject = (ServerInterface) UnicastRemoteObject
                    .exportObject(service, 0);
            java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry
                    .getRegistry("localhost", 1234);
            registry.rebind("ServerImplementation", myRemoteObject);


        } catch (Exception ex) {
            ex.printStackTrace();

        }
    }
}

Это класс Орден

public class Order implements Serializable{
private static final long serialVersionUID = 1L;
private int id;
private String name;
public Order(int id,String name){
    this.id=id;
    this.name=name;
}
}

У меня есть тот же класс интерфейса и заказа в клиенте.

это код клиента

public class TestClientProgram {

    public static void main(String[] args)  {
        try{
         java.rmi.registry.Registry registry = java.rmi.registry.LocateRegistry.getRegistry("localhost",1234);
         ServerInterface service=(ServerInterface) registry.lookup("ServerImplementation");
         Order orderObject=new Order(1,"dish");
         service.getOrderFromCash(orderObject);
        }
        catch(Exception e){
            e.printStackTrace();    
        }
        }
    }

Может ли кто-нибудь помочь мне, как я могу решить проблему?

Заранее спасибо Ренджит М.


person user236919    schedule 22.12.2009    source источник
comment
Вы запустили rmiregistry?   -  person    schedule 29.09.2011


Ответы (4)


Исключение указывает на то, что сервер не может найти метод, который вызывается клиентом (сообщение об ошибке немного вводит в заблуждение). Одной из возможных причин может быть то, что сервер и клиент работают с разными путями к классам и что код был достаточно изменен, чтобы интерфейсы RMI были несовместимы.

person jarnbjo    schedule 22.12.2009
comment
Что вводит в заблуждение в сообщении? В нем говорится, что «метод не поддерживается удаленным объектом», и это именно то, что вы здесь описываете. - person user207421; 22.10.2019

Что-то здесь не так. Ваш ServerInterface имеет метод getOrder, но реализация имеет getOrderFromCash. Я бы проверил, чтобы убедиться, что весь код скомпилирован и выполнен с теми же версиями этого интерфейса.

person Dan    schedule 22.12.2009

В ServerInterface вы должны заменить getOrder на getOrderFromCash.

person Pranjal Patidar    schedule 05.09.2019

Ну, это поздний ответ, но он может помочь новым пользователям.

Я использую RMI (клиент и сервер). Я получил ту же ошибку, и все было правильно, но я пропустил определение функции в интерфейсе сервера, в то время как она была определена в интерфейсе клиента !!

Я надеюсь, что этот ответ поможет вам :)

person Chris Sim    schedule 24.03.2015
comment
В RMI нет таких вещей, как интерфейс сервера и интерфейс клиента. Есть один удаленный интерфейс. Он должен быть одинаковым, под которым я подразумеваю битовую идентичность, на сервере и на клиенте. - person user207421; 01.02.2019