Serializacaja danych problem z odczytem

Odpowiedz Nowy wątek
2018-12-16 16:47
0

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

 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ć

Pozostało 580 znaków

2018-12-16 17:09
Szalony Polityk
0

Serializujesz pojedynczy obiekt, a przy deseralizacji oczekujesz listy...

Pozostało 580 znaków

2018-12-16 17:15
0

Zapisuje kilka obiektów

os.writeObject(new Person("Oleg ","Banan"));
os.writeObject(new Person("jan ","nowak"));

W takim razie jak to odczytac

Pozostało 580 znaków

2018-12-16 17:18
1
List<Person> per = new ArrayList<>();
os.writeObject(new Person("JAGODA ","BRONSKA"));

Zapisałeś tylko Person, a listę utworzyłeś ale nic z nią nie zrobiłeś. Spróbuj tak:

List<Person> per = new ArrayList<>();
per.add(new Person("JAGODA ","BRONSKA"));
os.writeObject(per);

Pozostało 580 znaków

2018-12-16 17:35
0

Dziękuję za odpowiedzi. Poprawiłem i działa. Ale 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

Nie jestem pewien czy rozumiem... - scibi92 2018-12-16 18:56
pokaż kod - Berylo 2018-12-16 19:11

Pozostało 580 znaków

2018-12-16 19:27
0

Klasa Person

package com.company;

import java.io.Serializable;

public class Person implements Serializable {
     private static final long serialVersionUID = 3812017177088226528L;
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Person(){}

    public Person(String firstName, String lastName) {
        setFirstName(firstName);
        setLastName(lastName);
    }

    public String toString() {
        return firstName + " " + lastName;
    }

}

potem

package com.company;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Person person = new Person();
        String fileName = "person.obj";

        FileOutputStream fs = new FileOutputStream(fileName,true);
       ObjectOutputStream os = new ObjectOutputStream(fs);

        List<Person> per = new ArrayList<>();
       per.add(new Person("Jurek", "Nowak"));
        per.add(new Person("Wacek ", "Zielonka"));
       os.writeObject(per);
 os.flush();
        os.close();

        System.out.println("Zapisano obiekt do pliku");

        // ODczyt danych z pliku ///////////////////////////////

        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());
            ois.close();
        }

    }

}

Wyświetla
Zapisano obiekt do pliku
Jurek Nowak
Wacek Zielonka

Potem zmieniam nazwiska uruchamiam program ( w pliku widzę że nowe nazwiska się dodały) ale wyświetla tylko te dwa zapisane za pierwszym razem/

Zawartość pliku.


¬í sr java.util.ArrayListxÒ™Ça I sizexp   w   sr com.company.Person4çlöôà L     firstNamet Ljava/lang/String;L lastNameq ~ xpt Jurekt Nowaksq ~ t Wacek t Zielonkax¬í sr java.util.ArrayListxÒ™Ça I sizexp   w   sr com.company.Person4çlöôà L  firstNamet Ljava/lang/String;L lastNameq ~ xpt Mirekt kaziuksq ~ t Aga t     kruszonkax
edytowany 1x, ostatnio: mprofitw, 2018-12-16 19:28

Pozostało 580 znaków

2018-12-16 19:38
0

Problem jest to, że tak naprawdę nie dopisujesz osób do listy tylko tworzysz nową listę i to ją dopisujesz do pliku. Dlatego za drugim razem jak chcesz wyświetlić listę to pobierasz tylko te pierwszą i ją wyświetlasz, a drugą olewasz.
Tutaj masz rozwiązanie: Zrezygnuj z listy i dopisuj same obiekty Person, a potem czytaj je w pętli jak w tym przykładzie:
https://stackoverflow.com/que[...]file-as-they-were-in-an-array

Pozostało 580 znaków

2018-12-17 16:53
0

Dzięki za odpowiedź teraz rozumiem dlaczego tak się dzieje. Niestety nie bardzo mogę połapać się w tym przykładzie.Może masz jakiś inny. Z góry Dziękuję!!!

Pozostało 580 znaków

2018-12-17 19:23
0

Tu masz esencje rozwiązania:

FileInputStream fis = new FileInputStream("outputFile");
ArrayList<Object> objectsList = new ArrayList<Object>();
boolean cont = true;
try{
   ObjectInputStream input = new ObjectInputStream(fis);
   while(cont){
      Object obj = input.readObject();
      if(obj != null)
         objectsList.add(obj);
      else
         cont = false;
   }
}catch(Exception e){
   //System.out.println(e.printStackTrace());
}

Jak widzisz obiekt pobierany jest ze streama za pomocą:

Object obj = input.readObject();

I działa to w pętli while tak długo aż readObject nie zwróci null. Za każdym razem gdy zwróci wartość inną niż null to ten obiekt dopisywany jest do listy. Powiedz czego konkretnie nie rozumiesz to spróbuję Ci wyjaśnić

Pozostało 580 znaków

2018-12-17 20:20
0

Ale co z zapisywaniem. Czy muszę zmienić kod? Jak? Bo nadal wczytuje mi tylko te elementy które zapisałem za pierwszym razem do pliku.

Pozostało 580 znaków

2018-12-17 20:28
0

Chyba że coś źle wyświetlam


for (Object el : objectsList) {
            System.out.println(el.toString());

        }

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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