When should i implement java.io.Serializable in RMI?
16,464
interface MyInterface extends Remote {
MyClass f(MyClass x) throws RemoteException;
}
class MyClass implements Serializable {
private int value;
public MyClass(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
you need Serializable interface to tell that your class can be sent via network
server code
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());
}
}
client code
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
}
}
Author by
user200340
Updated on June 30, 2022Comments
-
user200340 almost 2 years
I am just starting Java RMI and have some problems with when to use java.io.Serializable, so can anyone give me a RMI example that java.io.Serializable has to be implemented.
Thanks!!!
UPDATE: i had made a simple example, however, i think there are still problems as the output is not correct. Person Interfacepackage server; import java.rmi.Remote; import java.rmi.RemoteException; import 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; }
Person Implementation
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; } }
Address Class
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; } }
Server
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(); } } }
Client
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(); } } }
The output i got is
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
The address is not printed correctly PS: As you can see from Client class import
import server.PersonInterface; import server.Address;
I had copy PersonInterface.class and Address.class to client side to make Client compiled.
Final: So stupid!!! Add following code to Address.javapublic String toString(){ return addre1+ " " + addre2; }
OK, problems are solved!! :)