Avatar billede martinolsen Nybegynder
23. oktober 2001 - 13:48 Der 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
Avatar billede disky Nybegynder
23. oktober 2001 - 13:52 #1
bruger du 2 forskellige streams, altsdå en hver vej ?
Avatar billede martinolsen Nybegynder
23. oktober 2001 - 13:54 #2
Ja, jeg har to streams i hver sin ende af forbindelsen.
Avatar billede disky Nybegynder
23. oktober 2001 - 13:56 #3
ja men er der 2 seperate forbindelser ?

en fra client 1 -> 2 og en fra 2 -> 1 ?

Kunne tænkes at du ser samme objekt i begge ender.

prøv at luk forbindelsen imellem du modtager og sender rettet objekt.
Avatar billede logical Nybegynder
23. oktober 2001 - 14:12 #4
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.
Avatar billede martinolsen Nybegynder
23. oktober 2001 - 14:16 #5
Her er et kode-eksempel. Det er beskeden \"Hva\' så?\", der aldrig modtages i den anden ende:

public class Besked implements java.io.Serializable {
    private String modtager;   
    private String afsender;   
    private String indhold;

    public Besked(String modtager, String afsender, String indhold) {
      this.modtager = modtager;
      this.afsender = afsender;
      this.indhold = indhold;
    }
   
    public String getModtager() {
        return modtager;
    }

    public String getAfsender() {
        return afsender;
    }

    public void setIndhold(String nytIndhold) {
        indhold = nytIndhold;
    }

    public String getIndhold() {
        return indhold;
    }

}
       
import java.io.*;
import java.util.*;

public class Client {
   
    public static void main(String args[]) {
        Besked besked;
        ObjectInputStream is;
        ObjectOutputStream os;
       
        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());
           
            os.writeObject(besked);

            besked.setIndhold(\"Hva\' så?\");
            os.writeObject(besked);           
           
            is.close();
            os.close();
            socket.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
       
import java.net.*;
import java.io.*;
import java.util.*;

public class Server {
   
    public static void main(String args[]) {
        ObjectInputStream is;
        ObjectOutputStream os;
        Besked besked;
   
        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());

                besked = (Besked) is.readObject();
                System.out.println(\"Besked modtaget\");
                System.out.println(\"  Modtager: \"+besked.getModtager());
                System.out.println(\"  Afsender: \"+besked.getAfsender());
                System.out.println(\"  Indhold : \"+besked.getIndhold());

                besked = (Besked) is.readObject();
                System.out.println(\"Besked modtaget\");
                System.out.println(\"  Modtager: \"+besked.getModtager());
                System.out.println(\"  Afsender: \"+besked.getAfsender());
                System.out.println(\"  Indhold : \"+besked.getIndhold());
            }
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }
    }

}
       
Avatar billede logical Nybegynder
23. oktober 2001 - 15:00 #6
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(String modtager, String afsender, String indhold) {
    this.modtager = modtager;
    this.afsender = afsender;
    this.indhold  = indhold;
  }

  public Besked setNytIndhold(String indhold) {
    return new Besked(this.modtager, this.afsender, indhold);
  }
}

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

IT-JOB