Avatar billede winners79 Nybegynder
12. januar 2007 - 20:50 Der er 11 kommentarer og
1 løsning

Remote Vs Serializable

Jeg har et spørgsmål her som jeg ikke længere kan huske svaret på:

Når man med RMI modtager et object som er Serializable, så modtager man en kopi af objektet

Når man med RMI modtager et objekt som er Remote, så modtager man en reference til Objektet

Hvad sker der når man modtager en ArrayList (den er Serializable) som indeholder Personer, som man har valgt at lave en Remote.

Jeg ved at ArrayLister kun indeholder referencer til objekter.

Mit spørgsmål er så, hvad sker der hvis man ændrer i en person, sker ændringerne så også ovre på server siden eller skal man til at sende ArrayListen tilbage?
Avatar billede kalp Novice
12. januar 2007 - 20:56 #1
Unlike primitive data types, sending an object to a remote JVM is a nontrivial task. A Java object can be simple and self-contained, or it could refer to other Java objects in complex graph-like structure. Because different JVMs do not share heap memory, RMI must send the referenced object and all objects it references. (Passing large object graphs can use a lot of CPU time and network bandwidth.)
Avatar billede kalp Novice
12. januar 2007 - 20:56 #2
Det må betyde at den sender en kopi og hvis ikke så beskriver de det ikke godt nok.
Avatar billede arne_v Ekspert
12. januar 2007 - 21:28 #3
"reference til objektet" = "proxy til objektet"

interessant spoergsmaal - meget interessant spoergsmaal

jeg *tror* at den vil give dig en ArrayList med proxy objekter - jeg synes at
det vil give mest mening

du kan nemt verificere det med et lille test eksempel
Avatar billede arne_v Ekspert
13. januar 2007 - 22:03 #4
jep

ArrayList med procy objekter

her er et eksempel
Avatar billede arne_v Ekspert
13. januar 2007 - 22:03 #5
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.ArrayList;

public interface Foobar extends Remote {
    public ArrayList getList() throws RemoteException;
}
Avatar billede arne_v Ekspert
13. januar 2007 - 22:03 #6
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Data extends Remote {
    public int getA() throws RemoteException;
    public void setA(int a) throws RemoteException;
    public String getB() throws RemoteException;
    public void setB(String b) throws RemoteException;
}
Avatar billede arne_v Ekspert
13. januar 2007 - 22:03 #7
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;

public class FoobarImpl extends UnicastRemoteObject implements Foobar {
    private ArrayList lst;
    public FoobarImpl(ArrayList lst) throws RemoteException {
        this.lst = lst;
    }
    public ArrayList getList() {
        return lst;
    }
}
Avatar billede arne_v Ekspert
13. januar 2007 - 22:03 #8
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class DataImpl extends UnicastRemoteObject implements Data {
    private int a;
    private String b;
    public DataImpl() throws RemoteException {
        this(0, "");
    }
    public DataImpl(int a, String b) throws RemoteException {
        this.a = a;
        this.b = b;
    }
    public String toString() {
        return "(" + a + "," + b + ")";
    }
    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
    public String getB() {
        return b;
    }
    public void setB(String b) {
        this.b = b;
    }
}
Avatar billede arne_v Ekspert
13. januar 2007 - 22:04 #9
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class Client {
    public static void main(String[] args) {
        try {
            Foobar fb = (Foobar)Naming.lookup("rmi://localhost:9999/Foobar");
            Data d = (Data)fb.getList().get(1);
            d.setA(77);
            d.setB("Test");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (NotBoundException e) {
          e.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
13. januar 2007 - 22:04 #10
import java.io.IOException;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.util.ArrayList;

public class Server {
    public static void main(String[] args) {
        try {
            ArrayList lst = new ArrayList();
            lst.add(new DataImpl(1, "A"));
            lst.add(new DataImpl(2, "BB"));
            lst.add(new DataImpl(3, "CCC"));
            LocateRegistry.createRegistry(9999);
            Naming.rebind("rmi://localhost:9999/Foobar", new FoobarImpl(lst));
            System.out.println(lst);
            System.out.print("Press enter to continue");
            System.in.read();
            System.out.println(lst);
            System.exit(0);
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
Avatar billede winners79 Nybegynder
13. januar 2007 - 23:16 #11
Mange tak arne, smider du ikke lige et svar? er nu velfortjente point :)
Avatar billede arne_v Ekspert
13. januar 2007 - 23:19 #12
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester