如何在RMI方法中传递参数中的对象?

我试图在RMI方法中添加参数。 当我添加例如String一切正常。 但我不确定我是否可以传递我创建的对象。 我是RMI的新手,所以我的代码非常简单:

HelloIF

 public interface HelloIF extends Remote { String greeting(Context c) throws RemoteException; } 

你好

 public class Hello extends UnicastRemoteObject implements HelloIF { public Hello() throws RemoteException { } public String greeting(Context c) throws RemoteException { addToContext(c); report(c); return "greeting"; } void addToContext(Context c) { c.addID(Thread.currentThread().getId()); } void report(Context c) { System.out.println("Hello.greeting() thread : " + Thread.currentThread().getName() + " " + Thread.currentThread().getId()); System.out.println("Hello.greeting() context : " + c.getDistributedThreadName() + " " + c.getRequestType()); } } 

为RMIServer

 public class RMIServer { public static void main(String[] args) throws RemoteException, MalformedURLException { LocateRegistry.createRegistry(1099); HelloIF hello = new Hello(); Naming.rebind("server.Hello", hello); System.out.println("server.RMI Server is ready."); System.out.println("RMIServer.main() thread : " + Thread.currentThread().getName() + " " + Thread.currentThread().getId()); } } 

RMIClient

 public class RMIClient { public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException { Context context = new Context("request1", Thread.currentThread().getName()+System.currentTimeMillis()); Registry registry = LocateRegistry.getRegistry("localhost"); HelloIF hello = (HelloIF) registry.lookup("server.Hello"); System.out.println(hello.greeting(context)); System.out.println("RMIClient.mian() thread : " + Thread.currentThread().getName() + " " + Thread.currentThread().getId()); } } 

最后我的class级上下文

 public class Context { private String requestType; private String distributedThreadName; private List IDList; (...) getters/setters } 

我该怎么做才能使传递上下文成为可能?

您的对象应该实现Serializable 。 我可以看到这将是一个问题。 这是必需的,因为两个部分之间的通信是使用序列化完成的,因此需要发送到另一部分的每个对象都需要是实现Serializable的类的实例。

 public class Context implements Serializable { private String requestType; private String distributedThreadName; private List IDList; (...) getters/setters } 

请添加serialVersionUID作为一种良好做法。 就像是:

 private static final long serialVersionUID = 20120731125400L;