• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Java Seriazlizacja klasy. problem z odczytem

Object Storage Arubacloud
0 głosów
236 wizyt
pytanie zadane 16 grudnia 2018 w Java przez mprofit Nowicjusz (180 p.)

Mam przykładową klasę Person z dwoma polami imie i nazwisko. Zapisuje do pliku poprzez. Dane w pliku się zapisują. Problem jest odczytem

```java
 String fileName = "person.obj";
FileOutputStream fs = new FileOutputStream(fileName, true);
                ObjectOutputStream os = new ObjectOutputStream(fs);
 List<Person> per = new ArrayList<>();
os.writeObject(new Person("JAGODA ","BRONSKA"));


Przyróbie odczytu danych poprzez
 

 FileInputStream fis = new FileInputStream(fileName);
                ObjectInputStream ois = new ObjectInputStream(fis);
  List<Person> pera = (List<Person>)ois.readObject();
for (Person el: pera){
    System.out.println(el.getFirstName()+" "+el.getLastName());
}

```
Mam bład
Exception in thread "main" java.lang.ClassCastException: com.company.Person cannot be cast to java.util.List
    at com.company.Main.main(Main.java:58)
Jak sobie z tym poradzić

1 odpowiedź

0 głosów
odpowiedź 16 grudnia 2018 przez RafalS VIP (122,820 p.)

Kompilator dokładnie mówi z czym jest problem. Zapisałeś pojedyncze obiekty Person:

os.writeObject(new Person("JAGODA ","BRONSKA"));

a próbujesz odczytać je jako liste:

List<Person> pera = (List<Person>)ois.readObject(); 

To nie działa tak, że jak zapiszesz kilka obiektow po sobie to możesz to przeczytać jako liste :P. Musisz stworzyć liste, wypełnić ją obiektami i dopiero zapisać.

komentarz 16 grudnia 2018 przez mprofit Nowicjusz (180 p.)
List<Person> per = new ArrayList<>();
per.add(new Person("JAGODA ","BRONSKA"));
os.writeObject(per);

Zrobiłem tak tylko że  jak zapisze np. dwa nazwiska i je wczytam jest ok. Ale jak poźniej dopisze kolejne dwa widzę że w pliku dopisały się te nowe nazwiska ale wczytuje i wyświetla tylko te pierwsze dwa

komentarz 16 grudnia 2018 przez RafalS VIP (122,820 p.)
Prawdopodobnie nie nadpisujesz zawartości pliku tylko dopisujesz kolejną liste.
komentarz 16 grudnia 2018 przez mprofit Nowicjusz (180 p.)
Czyli jak mam to poprawnie zrobić?
komentarz 16 grudnia 2018 przez RafalS VIP (122,820 p.)

Korzystasz z takiego konstruktora:

FileOutputStream(File file, boolean append) 

 o tutaj:

FileOutputStream fs = new FileOutputStream(fileName, true); 

Może spróbuj z false :P

Albo nawet bez drugiego parametru, nie jestem pewny ale moze zadziałać.

komentarz 16 grudnia 2018 przez mprofit Nowicjusz (180 p.)
Ten konstruktor z drugim parametrem true jest po do aby dane do pliku były dopiswyane a nie nadpisywane. I tak jest widzę w pliku że kolejne dane są dopisane tylko przy odczycie na konsole wyświetlone są te dane które były wprowadzone za pierwszym razem a nie później także dopisane.
komentarz 16 grudnia 2018 przez RafalS VIP (122,820 p.)
os.writeObject(lista)

Plik:

<reprezentacja obiektu lista>

lista.add(new Person());
os.writeObject(lista);

Plik:

<reprezentacja obiektu lista><reprezentacja obiektu lista>

Obiekty wczytywane sa po kolei. Wczytujesz pierwszy zapisany obiekt, jesli spróbujesz wczytac kolejny to dostaniesz to co wedlug Ciebie przepada.
komentarz 17 grudnia 2018 przez mprofit Nowicjusz (180 p.)
Doszedłem to tego że tak naprawdę nie dopisuję osób do listy tylko tworzę nową listę i to ją dopisuję do pliku. Dlatego za drugim razem gdy chcę wyświetlić listę to pobieram tylko te pierwszą i ją wyświetlam.
Należałoby chyba zrezygnować z  listy i dopisywać  same obiekty Person, a potem wczytać te obiekty np. w pętli. Może ktoś podać jakiś zwięzły kod, przykład. DZIĘKI

Podobne pytania

0 głosów
1 odpowiedź 322 wizyt
pytanie zadane 30 grudnia 2018 w Java przez Ditrix Mądrala (5,650 p.)
0 głosów
1 odpowiedź 138 wizyt
pytanie zadane 30 maja 2017 w Java przez ewazdomu Początkujący (320 p.)
0 głosów
2 odpowiedzi 898 wizyt
pytanie zadane 25 grudnia 2015 w Java przez pulpet112 Użytkownik (760 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...