serializacja, dziwny problem

0

szybki opis problemu:
przy pierwszym uruchomieniu metody odczytajKsiazki jest wszystko ok, natomiast kolejne wywolania tej metody zwracaja takie same wyniki!

po stronie servera:

protected void wyslijKsiazke(Ksiazka ksiazka) {
        if (s != null) {
            try {
                output.writeObject(ksiazka);
                output.flush();
                System.out.println("Wysylanie,numer:" + ksiazka.getNumer() + "nazwisko:" + ksiazka.getNazwisko());
            } catch (Exception e) {
                System.out.println("Wyjatek klienta przy wysylaniu ksiazki " + e);
            }
        }
    }

    protected void wyslijKsiazki(ArrayList<Ksiazka> mksiazka) {
        Ksiazka pom;
        Iterator it = mksiazka.iterator();
        while (it.hasNext()) {
            wyslijWiadomosc(good);
            pom = (Ksiazka) it.next();

            wyslijKsiazke(pom);
        }
        wyslijWiadomosc(bad);
    }

po stronie klienta:

protected Ksiazka odbierzKsizke() {
        Ksiazka ksiazka = null;
        Object obj=null;
        try {
            obj =  input.readObject();
            ksiazka=(Ksiazka) obj;
            System.out.println("odbieranie,numer:" + ksiazka.getNumer() + "nazwisko:" + ksiazka.getNazwisko());
        } catch (Exception e) {
            System.out.println("Wyjatek przy odbieraniu ksiazki " + e);
        }
        return ksiazka;
    }

    protected ArrayList<Ksiazka> odbierzKsizki() {
        ArrayList<Ksiazka> mksiazka = null;
        Ksiazka pom;
        if (odbierzWiadomosc().porownajWiadomosc(good)) {
            mksiazka = new ArrayList<Ksiazka>();
            do {
                pom = odbierzKsizke();
                mksiazka.add(pom);

            } while (odbierzWiadomosc().porownajWiadomosc(good));
        }
        return mksiazka;
    }

i jeszcze co to jest ksiazka:

public class Ksiazka implements Serializable {

    private String nazwisko = "a";
    private String aaa = "abc";
    private int numer;
...
}

szybki dump serwera:

Klient zaczyna prace 1
wiad 1 : pokazTytuly_ksiazki
wiad 1 : dodajTytul_ksiazki
wiad 1 : pokazTytuly_ksiazki
wiad 1 : pokazTytuly_ksiazki
wiad 1 : pokazKsiazki
wiad 1 : dodajKsiazke
wiad 1 : pokazTytuly_ksiazki
wiad 1 : pokazKsiazki
Wysylanie,numer:123nazwisko:a
wiad 1 : oddajKsiazke
wiad 1 : wypozyczKsiazke
wiad 1 : pokazTytuly_ksiazki
wiad 1 : pokazKsiazki
Wysylanie,numer:123nazwisko:qwe
wiad 1 : dodajTytul_ksiazki
wiad 1 : pokazTytuly_ksiazki
wiad 1 : pokazKsiazki
Wysylanie,numer:123nazwisko:qwe
wiad 1 : pokazTytuly_ksiazki
wiad 1 : pokazKsiazki
wiad 1 : pokazTytuly_ksiazki
wiad 1 : pokazKsiazki
Wysylanie,numer:123nazwisko:qwe
wiad 1 : byebye
Klient konczy prace 1

jeszcze szybszy dump klienta:

odbieranie,numer:123nazwisko:a
odbieranie,numer:123nazwisko:a
odbieranie,numer:123nazwisko:a
odbieranie,numer:123nazwisko:a

jak widac z tych dumpow wyniki sa sprzeczne i w tym problem.
pomysly/pytania ? cokolwiek. rece mi juz opadaja.

0

Musisz wysyłać po jednej książce? Wyślij (i odczytaj) obiekt typu ArrayList<Ksiazka>.

0

fakt nie probowalem tego, mam jeszcze takie metody:

protected void wyslijKsiazki(ArrayList<Ksiazka> mksiazka) {
        Ksiazka pom;
        Iterator it = mksiazka.iterator();
        while (it.hasNext()) {
            wyslijWiadomosc(good);
            pom = (Ksiazka) it.next();

            wyslijKsiazke(pom);
        }
        wyslijWiadomosc(bad);
    }

i

protected ArrayList<Ksiazka> odbierzKsizki() {
        ArrayList<Ksiazka> mksiazka = null;
        Ksiazka pom;
        if (odbierzWiadomosc().porownajWiadomosc(good)) {
            mksiazka = new ArrayList<Ksiazka>();
            do {
                pom = odbierzKsizke();
                mksiazka.add(pom);

            } while (odbierzWiadomosc().porownajWiadomosc(good));
        }
        return mksiazka;
    }

sprobuje wyslac caly arralist, i zobaczymy. dzieki za wskazowke !

EDIT: sprobowalem z wyslaniem calej arraylist, ale to nie pomaga, dokladnie to samo :(

0

Ja też popróbowałem, u mnie działa.

//wysyłanie
        ObjectOutputStream oos = null;
        ArrayList<Book> books=new ArrayList<Book>();
        books.add(new Book("Kowalski","Jan",33));
        books.add(new Book("Nowak","Marian",44));
        try
        {
            Socket socket = new Socket(host,4000);
            oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(books);
            oos.flush();
            oos.close();
        }
        catch(Exception e) 
        {
            System.out.println(e.toString());
        }
//odbieranie
        ArrayList<Book> books;
        try
        {
            books = (ArrayList<Book>) ois.readObject(); //ois jest typu ObjectInputStream
            for(int i=0;i<books.size();i++)
            {
                System.out.println(books.get(i));;
            }
            ois.close();
            client.close();
        }
        catch(Exception e)
        {
        }
0

ja mam ten sam problem i tez nie mam pojecia dlaczego sa stare dane....
gdy nie bedzie zamykalo sie strumienia po kazdym wyslaniu obiektu problem nadal istnieje

0

bo, tu problem sie pojawia dopiero po edycji pol, za pierwszym razem dziala, kazde kolejne powtarza wyniki pierwszego wywolania.
ble2, hmmm, w oststecznosci tak zrobie. dzieki za pomysl !
btw jakie ide uzwyacie? to jest kompilowane w netbeans 6.8.

1 użytkowników online, w tym zalogowanych: 0, gości: 1