Skocz do zawartości
thuGG

Zmiana Zawartosci Obiektu

Rekomendowane odpowiedzi

Witam,

mam nastepujacy problem:

Mam klase (Zapytanie), na ktora sklada sie kilka pol typu String i tablica 10 elementowa typu boolean, przesylam obiekt tego typu do serwera, ktory serwer rzutuje z typu Object na Zapytanie.

Problem w tym, ze zawartosc tablicy boolean po odebraniu przez serwer jest inna niz ta ktora wyslal serwer.

Wszystko dziala na soketach w standardowy sposob (tak jak to opisuja w ksiazkach).

Czy ktos cos wie o tym moze.

Uzywam java v1.5.0_02

Z gory dziekuje za odpowiedzi

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Napisalem kiedys aplikacje typu klient serwer na javie.

Kazda klasa dziedziczy defoultowo z klasy object, rzutowanie z typu object na typ zapytanie jest tu niepotrzebne. Nie kazdy object jest zapytaniem ale kazde zapytanie jest objectem. Nie pamientam dokladnie funkcji socketu ale najprawdopodobniej jest to cos w stylu :

funkcja read zwraca object:

ServerSocket socket1 = new ServerSocket();//najprawdopodobniej konstruktor klasy ServerSocket przyjmuje jakies //datkowe parametry jak naprzyklad string z nazwa URL lub adresem IP//ale nie jestem pewien bo moze istniec metoda GetUrlName lub jeszcze //lub jeszcze cos zwiazanego z InetAdress ale nie pamietam , nie w tym rzecz//wieczapytanie nowe = socket1.read();//a niezapytanie nowe = (zapytanie)socket1.read();

Wiem z dowiadczenia ze rzutowania typow powinno sie urzywac tylko gdy jest naprawde potrzebne a w tym przypadku jest zbedne. A rzutowanie calych klas to dosc skomplikowany mechanizm , wiesz w prostym przypadku rzutowania integer na string zawszezyskasz poprawny wynik ale przy klasach to juz jest problem , istnieje interfejs serializable z ktorym proponowal bym sie zapoznac rownierz..

 

Powodzenia na JAVIE

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Moze ja wkleje fragmenty kodu, wtedy bedzie wiadomo co i jak:

Aha i zaznaczam ze jestem poczatkujacym programista.

serwer:

public class WatekSerwera extends Thread{

   

    private Socket socket;

    private OperacjeBazy operacje;

    private ObjectInputStream input;

    private ObjectOutputStream output;

       

    public WatekSerwera(Socket s,OperacjeBazy op){

        socket=s;

        operacje=op;       

        try {

            input=new ObjectInputStream(socket.getInputStream());

            output=new ObjectOutputStream(socket.getOutputStream());

        } catch (IOException e) {

            e.printStackTrace();

        }

        wyslijListeBranz();

        start();       

    }

   

    public void run() {       

        try {

            while(true) {

                Object o=input.readObject(); //czytanie obiektu

                if (o!=null && o instanceof Instytucja){                                   

                    odpowiedz((Instytucja)o); // rzutowanie

                }

            }

        } catch (IOException e) {

            System.out.println("rozlaczono");

        } catch (ClassNotFoundException e) {

            e.printStackTrace();           

        }

        try {

            socket.close();           

            System.out.println("zamknieto watek serwera");

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

   

    public void odpowiedz(Instytucja i){

        try {           

            ArrayList <Instytucja> lista=operacje.szukajUsun(i,false);

            System.out.println("rzmr "+lista.size());

            output.writeObject(lista);

            output.flush();

        } catch (NullPointerException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

   

    public void wyslijListeBranz(){

        try {

            Set<String> lista=operacje.zwrocListeBranz();

            output.writeObject(lista);

            output.flush();

        } catch (NullPointerException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

To klient:

public class Klient extends Thread{

   

    ObjectOutputStream output;

    ObjectInputStream input;

    Okno okno;

    InetAddress addr;

    Socket socket; 

   

    public Klient(Okno o){

        okno=o;       

    }

   

    public void polacz(){

        try {

            addr=InetAddress.getByName("localhost");

            socket=new Socket(addr,12293);

            output=new ObjectOutputStream(socket.getOutputStream());

            input=new ObjectInputStream(socket.getInputStream());

            new WatekKlienta(socket,okno,input);

            System.out.println("polaczono");

        } catch (ConnectException c){

            System.out.println("nie polaczono");       

        } catch (UnknownHostException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }               

    }   

   

    public void wyslijZapytanie(Instytucja i){             

        try {           

            output.writeObject(i); //wyslanie obiektu

            output.flush();

        } catch (IOException e) {

            System.out.println("Polaczenie z serwerem zostalo zerwane, serwer nie odpowiada");

        }

    }

}

A to klasa, ktorej obiekt przesylam do serwera, ktory to wlasnie jest inny po przeslaniu:

public class Instytucja implements Serializable{

       

    private static final long serialVersionUID = 1L;

   

    public String rodzaj="";

    public String branza="";

    public String nazwa="";

    public String miasto="";

    public String ulica="";

    public String nrDomu="";

    public String nrLokalu="";

    public String telefon1="";

    public String telefon2="";

    public String fax="";

    public Boolean[] tab=new Boolean[10];

   

    public Instytucja (){

       

    }

   

    public Instytucja(String rodzaj,String branza,String nazwa,String miasto,String ulica,String nrDomu,

                        String nrLokalu,String telefon1,String telefon2,String fax,Boolean[] tab){

       

        this.rodzaj=rodzaj;

        this.branza=branza;   

        this.nazwa=nazwa;

        this.miasto=miasto;

        this.ulica=ulica;

        this.nrDomu=nrDomu;

        this.nrLokalu=nrLokalu;

        this.telefon1=telefon1;

        this.telefon2=telefon2;

        this.fax=fax;

        this.tab=tab;

    }

    public Instytucja(String rodzaj,String branza,String nazwa,String miasto,String ulica,String nrDomu,

            String nrLokalu,String telefon1,String telefon2,String fax){

 

        this.rodzaj=rodzaj;

        this.branza=branza;   

        this.nazwa=nazwa;

        this.miasto=miasto;

        this.ulica=ulica;

        this.nrDomu=nrDomu;

        this.nrLokalu=nrLokalu;

        this.telefon1=telefon1;

        this.telefon2=telefon2;

        this.fax=fax;       

    }

   

    public String toString(){

        String tmp="";

        return tmp=nazwa+"  |  "+branza+"  |  "+rodzaj;

    }

}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie moge dzis odpidac ale widze kilka subtelnych bledow ktore moga wplynac na zawartosc tablicy booleanow tab . przeczytaj moj poprzedni watek i popatrz u siebie w kod przy porownywaniu do instanceof.

 

Jesli ci to nie pomorze to w nocy napisze o co chodzi , choc nie mam kompilatora przy sobie ale sproboje pomoc

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ale wlasnie po to jest instaneof, sprawdza czy obiekt ktory został odebrany jest wlasciwego typu, robie rzutowanie dopiero po upewnieniu sie ze rzutowanie sie powiedzie.

Przecierz nie moge zrobic czegos takiego:

"Instytucja i=input.readObject()"

bo kompilator mi tego nie przepusci bez rzutowania, a ty widze sugerujesz zebym tak wlasnie zrobil.

Pozdro

 

 

Edit:

Sprawa rozwiazana, probem tkwil w buforowaniu strumienia, sprawe zalatwil dodatkowy konstruktor w klasie Instytucja:

 

public Instytucja (Instytucja i){

tab = i.tab.clone();

}

 

Podziekowania dla mojego w wykladowcy z PŚK.

Edytowane przez thuGG

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...