我应该什么时候在RMI中实现java.io.Serializable?

我应该什么时候在RMI中实现java.io.Serializable?,java,rmi,Java,Rmi,我刚刚开始使用Java RMI,在何时使用Java.io.Serializable方面遇到了一些问题,所以有人能给我一个必须实现Java.io.Serializable的RMI示例吗 谢谢!!! 更新: 我做了一个简单的例子,但是,我认为仍然存在问题,因为输出不正确。 人机界面 包服务器; 导入java.rmi.Remote; 导入java.rmi.RemoteException; 导入java.rmi.server.UnicastRemoteObject public interface P

我刚刚开始使用Java RMI,在何时使用Java.io.Serializable方面遇到了一些问题,所以有人能给我一个必须实现Java.io.Serializable的RMI示例吗

谢谢!!!
更新: 我做了一个简单的例子,但是,我认为仍然存在问题,因为输出不正确。 人机界面

包服务器; 导入java.rmi.Remote; 导入java.rmi.RemoteException; 导入java.rmi.server.UnicastRemoteObject

public interface PersonInterface extends Remote  
{
    public void setName(String name) throws RemoteException;
    public String getPerson() throws RemoteException;
    public void setAddress(Address address) throws RemoteException;
}
个人执行

package server;
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
import java.rmi.Naming;
import java.rmi.Remote;

class Person extends UnicastRemoteObject implements PersonInterface
{
    private String name;
    private int age;
    private Address address;


    Person() throws RemoteException {super();}
    Person(String name,int age, Address address) throws RemoteException {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    public void setName(String name) throws RemoteException {
        this.name = name;
    }
    public void setAddress(Address address) throws RemoteException{
        this.address = address;
    }

    public String getPerson() throws RemoteException {
        return "Person : " + name + " age : " + age + " address : " + address;
    }
}
地址类

package server;
import java.io.Serializable;

public class Address implements Serializable
{
    private static final long serialVersionUID = 227L;
    private String addre1;
    private String addre2;

    public Address() {}
    public Address(String addre1,String addre2){
        this.addre1 = addre1;
        this.addre2 = addre2;   
    }
}
服务器

package server;
import java.rmi.Naming;

class Server 
{
    public static void main(String[] args) 
    {
        try{
        //create an instance of the RemoteDatabaseServer
            Person person = new Person();
            //rmi://[host][:port]/object
            String namePerson = "rmi://localhost:9999/person";

            //bind this instance to localhost port999 with name database
            Naming.bind(namePerson, person);
            System.out.println("Server is running...");
        }catch(Exception ex){
            System.out.println("Server Exception...");
            ex.printStackTrace();
        }
    }
}
客户

package client;
import java.rmi.RMISecurityManager;
import java.rmi.Naming;
import server.PersonInterface;
import server.Address;


class Client
{
    public static void main(String[] args) 
    {
        try{
            System.setSecurityManager(new RMISecurityManager());
            String namePerson = "rmi://localhost:9999/person";
            PersonInterface person = 
                (PersonInterface)Naming.lookup(namePerson);

            person.setName("myName");
            System.out.println(person.getPerson());
            person.setName("myNewName");
            Address address = new Address("123","123");
            person.setAddress(address);
            System.out.println(person.getPerson());
        }catch(Exception ex){
            System.out.println("Client failure...");
            ex.printStackTrace();
        }
    }
}
我得到的结果是

D:\java -Djava.security.policy=d:\Client\policy\client.policy client.Client Person : myName age : 0 address : server.Address@1d6776d Person : myNewName age : 0 address : server.Address@10a2d64 我将PersonInterface.class和Address.class复制到客户端,以便编译客户端


最终: 太蠢了!!! 将以下代码添加到Address.java

public String toString(){
    return addre1+ " " + addre2;
}
好的,问题解决了!!:)

您需要可序列化的接口来告诉您的类可以通过网络发送

服务器代码

class Service extends UnicastRemoteObject  implements MyInterface {
   public Service() {
   }
   public MyClass f(MyClass v) throws RemoteException {
       return new MyClass(v.getValue() + 1)
   }

   public static void main(Strint arg[]) {
      Registry r = LocateRegistry.createRegistry(1099);
      r.rebind("service", new Service());
   }
}
客户端代码

class Client {
       public static void main(Strint arg[]) {
          Registry r = LocateRegistry.getRegistry("localhost", 1099);
          MyInterface service = (MyInterface)r.lookup("service");

          MyClass result = service.f(new MyClass(123));
          System.out.println(result.getValue());  //print 124 here
       }
  }

谢谢,那么您的意思是通过使MyClass可序列化,客户端能够创建MyClass对象吗?因此,实现MyInterface的远程对象(比如称为myRemoteObject)可以调用方法f并将MyClass对象作为参数,例如:MyInterface myRemoteObject=(MyInterface)Naming.lookup(name)。。。。f(新的MyClass());是这样吗?太好了!!还有一个问题,我是否需要像处理MyInterface.class一样将MyClass.class复制到客户端包,或者MyInterface.class将在MyClass扩展到Remote时以某种格式封装MyClass。您需要在客户端使用MyClass,因为没有它就无法编译。但一般来说,MyClass也可以是接口,客户端只需要这个接口,而不需要实现(只在服务器中定义)。因此,如果MyClass被定义为接口,那么我想我需要在注册表上绑定它(就像Naming.bind(“rmi://localhost:9999/myClassObject“,myClassObject);)。另外,你能解释一下“客户端只需要这个接口”吗?我想如果MyClass改为interface,我们还是MyInterface,所以实际上会有两个服务。@antony:“你需要可序列化的接口来告诉你的类可以通过网络发送”——这很模糊,掩盖了一些重要的细节。你能详细说明一下吗?
class Service extends UnicastRemoteObject  implements MyInterface {
   public Service() {
   }
   public MyClass f(MyClass v) throws RemoteException {
       return new MyClass(v.getValue() + 1)
   }

   public static void main(Strint arg[]) {
      Registry r = LocateRegistry.createRegistry(1099);
      r.rebind("service", new Service());
   }
}
class Client {
       public static void main(Strint arg[]) {
          Registry r = LocateRegistry.getRegistry("localhost", 1099);
          MyInterface service = (MyInterface)r.lookup("service");

          MyClass result = service.f(new MyClass(123));
          System.out.println(result.getValue());  //print 124 here
       }
  }