Problem z deserializacją(odczyt z pliku)

0

Witam wszystkich

Mam taki fragment kodu:
FileInputStream aa = new FileInputStream("e:\dane.dat");
System.out.println("ilosc znakow1: " + aa.available());
System.out.println((aa == null)?"aa = null" : "aa != null");
ObjectInputStream ois = new ObjectInputStream(aa);
System.out.println("ilosc znakow2: " + ois.available());

A taki jest wynik działania tego kodu:
ilosc znakow1: 308
aa != null
ilosc znakow2: 0

Czy możecie mi powiedzieć, gdzie się podziewają te 308 znaków. Przecież w obiekcie ois coś powinno być, a nie ma i nie mam pojęcia co jest.

Informacje do pliku "dane.dat zostały zapisane przy użyciu funkcji:
public void zapisz()
{
try
{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("dane.dat"));
oos.writeObject(spis);
oos.close();
}
catch(Exception e)
{
}
}
W tym pliku są przechowywane informacje o książkach przy użyciu obiektu klasy "SpisKsiazek"

Pytałem się na grupach dyskusyjnych i niestety nie dostałem żadnej odpowiedzi :( . Wszystkie tutoriale itp jakie widziałem właśnie tak kazały deserializować dane a tu nic z tego i nie wiem co jest.

0

Nie wiem z czego wynika to roznica ale deserializacje zrobisz tak:

ObjectInputStream ois = new ObjectInputStream(aa);
SpisKsiazek spis = (SpisKsiazek) ois.readObject();

Jeszcze taka mala uwaga do Twojego kodu - najpierw wywolujesz na aa metode available, a pozinej robisz test na null - troche odwrotnie to powinno byc jesli juz.
Pozdro.

0
pikseloza napisał(a)

Nie wiem z czego wynika to roznica ale deserializacje zrobisz tak:

ObjectInputStream ois = new ObjectInputStream(aa);
SpisKsiazek spis = (SpisKsiazek) ois.readObject();

Co do tej serializacji to robię tak

                    obiekt = ois.readObject();
                    oos = new ObjectOutputStream(gniazdo.getOutputStream());
                    oos.writeObject(obiekt);//wyslanie do klienta
                    oos.flush();
                    ois.close();
                    oos.close();

ponieważ jak widzisz obiekt jest najpierw odczytywany nie robiąc rzutowania na konkretny typ ponieważ to rzutowanie jest dopiero robione po stronie klienta i wykonywane wszystkie inne operacje.

pikseloza napisał(a)

Jeszcze taka mala uwaga do Twojego kodu - najpierw wywolujesz na aa metode available, a pozinej robisz test na null - troche odwrotnie to powinno byc jesli juz.

To było tylko wstawione w celu pokazania gdzie leży problem i w docelowej wersji nie będzie tego

Takie jedno dodatkowe pytanie. Czy można wstawiać(czy nie ma jakiś przeciwwskazań) do takiego serializowanego strumienia który służy do przesyłania danych przez sieć kilku różnych typów, a potem odczytywać je w tej samej kolejności i deserializować na odpowiednie typy ?
Przykładowo najpierw wstawiam integera, a potem jakąś klasę, a przy odczycie najpierw odczytuję integera, a potem tą klasę.

0

Jasne ze mozesz tak zapisywac kilka obiektow bylebys deserializowal w odpowiedniej kolejnosci.

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