23. oktober 2001 - 13:48Der er
5 kommentarer og 1 løsning
ObjectStreams
Hej !
Jeg anvender ObjectStreams til at kommunikere mellem to java-applikationer. Først instantierer jeg et objekt og sender det vha. writeObject-metoden. Herefter ændrer jeg en attribut på objektet og sender det igen. På modtager-siden er attributten ikke ændret, da objeketet modtages anden gang. Hvorfor?
Mvh. Martin Olsen Adjunkt Datamatikeruddannelsen, Ikast
Hvorfor er lidt svær at svare på sådan umiddelbart :-)
Som regel virker det korrekt, hvis det ellers er lavet ordentligt. Hvordan kommkunikerer de to apps med hinanden? sockets? Filer? Husker du at flushe outputstream når du har srevet data? Hvordan får du restoret? hvis det er: try{ myobj = (MyObj) is.readObject(); catch (Exception e) {}
Har du så kigget på exception delen?
Lidt mere forklaring, så kan det være vi kan hjælpe dig.
System.out.println(\"Client: Så starter festen!\"); besked = new Besked(\"Mette\", \"Martin\", \"Hej Mette!\"); try { Socket socket = new Socket(\"127.0.0.1\", 5011); is = new ObjectInputStream(socket.getInputStream()); os = new ObjectOutputStream(socket.getOutputStream());
System.out.println(\"Server: Så starter festen\"); try { ServerSocket serverSocket = new ServerSocket(5011); while (true) { Socket socket = serverSocket.accept(); System.out.println(\"Server: Modtaget ny client fra \"+socket.getInetAddress()); os = new ObjectOutputStream(socket.getOutputStream()); is = new ObjectInputStream(socket.getInputStream());
Arh, hvorfor nærlæser jeg ikke spørgsmålet...Forklaringen er følgende:
Hvis du skriver det samme object til en ObjectOutputStream flere gange bliver der ikke lavet et nyt object, men der refereres til det foregående. Dvs du sender et object aBesked og en reference til samme.
Grunden til at java gør den slags numre er for at kunne genkende hvis et objekt bliver refereret fra flere forskellige klasser som måske skal serialiseres. Disse krydsreferencer må nemlig ikke betyde forskellige objekter på modtagersiden.
Du bruger det samme objekt, og det er derfor altid det samme objekt. Også selv om attributter bliver ændret i mellemtiden.
På modtagersiden ser din inputstream objektet aBesked + en reference til aBesked, så derfor det samme indhold.
Så svaret er: fordi... :-)
Jeg foreslår også at du laver Besked klassen, så man ikke kan ændre i indholdet (Trods alt er en besked en besked, og man kan jo heller ikke genbruge post-it beskeder f.eks.). Et eksempel:
class Besked implements java.io.Serializable { public final String modtager; public final String afsender; public final String indhold;
public Besked setNytIndhold(String indhold) { return new Besked(this.modtager, this.afsender, indhold); } }
Synes godt om
Ny brugerNybegynder
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.