Java serializacja obiektu i obiektów potomnych

0

Cześć wszystkim.

Mam dwa pytania co do serializacji.

Pytanie 1. Załóżmy, że mamy klasę

public class Jeden{
//kod
}

klase potomną

public class Dwa {
//kod
}

i klasę potomną, klasy potomnej

public class Trzy{
//kod
}

Jak przeprowadzić serializację obiektów reprezentujących rożne klasy? Da się ją przeprowadzić dla obiektów reprezentujących różne klasy, czy trzeba to zrobić osobno?

Pytanie 2. Załóżmy, że mam 10 obiektów reprezentujących klasę 1, jak edytować dane obiektu x zserializowanego do pliku? Muszę stworzyć nowy obiekt, wczytać do niego dane i wtedy edytować? A jeśli w pliku mam zserializowane różne obiekty, jak wtedy to zrobić?

Będę wdzięczny za pomoc.

0

Nie serializuj binarnie tylko do jakiegoś formatu czytelnego dla człowieka, szczególnie jak chcesz to edytować ręcznie. Możesz użyć np. JAXB i zrzucać do XMLa wszystko.

0

Taki był plan. Z tymże nie chcę edytować tego ręcznie w pliku, tylko wczytać np obiekt 20 i edytować np wagę.
Czyli generalnie dla klasy i jej potomków musiałbym stworzyć osobne metody do serializacji?:

Jeden test = new Jeden();
Dwa test1 = new Dwa();
XMLEncoder e = new XMLEncoder(
                     new BufferedOutputStream(
                       new FileOutputStream(nazwaPliku)));
    e.writeObject(test1);
    e.writeObject(test2);
    e.close();

A teraz, jak zamknę program, otwieram go ponownie (w pliku mam zapisane 10 obiektów każdego typu) jak edytować jeden konkretny? Musze wczytać wszystkie?

Myślałem też, żeby skorzystać z listy, ale jeśli dobrze rozumiem, to mogę ją zdefiniować dla danej klasy, czyli potomka do niej już nie wpiszę?

ArrayList<Jeden> lista = new ArrayList<Jeden>();
0
  1. Nie używaj XMLEncoder/Decoder bo są Deprecated
  2. Nie da sie edytować fragmentu pliku bo nie da sie go "rozpychać". Możesz co najwyżej nadpisywać dane ale to słaba opcja, więc: tak, musisz sobie wszystko wczytać.
  3. List<T> może trzymać zarówno obiekty T jak i obiekty klas pochodnych.
0
  1. Czyli lepiej co? Znalazłem XStream. Jest coś jeszcze, które lepsze? Deprecated w sensie przestarzałe? Jaki to ma wpływ na program, że lepiej nie używać? Gdzieś może nie zadziałać?

  2. Dzięki tak zrobię.

  3. Stworzyłem listę, wedle zalecenia, teoretycznie działa. Chciałem wyświetlić jej zawartość, ale mam pewien problem. Poniższy kod nie działa,

List<Object> lista = new ArrayList<>();

System.out.println(lista.toString());

program wyświetla mi jakiś dziwny ciąg znaków. Gdzieś znalazłem informację że należy nadpisać ToString w klasie

@Override
   public String toString() {

}

czy ktoś mi może wyjaśnić dlaczego?

1
  1. JAXB
  2. A czego sie spodziewałeś? Że jak sie ta lista wypisze? Musisz pokazać jak chcesz ją wypisać, np. poprzez
@Override
public String toString() {
    return lista.stream()
                   .map(Object::toString)
                   .collect(Collectors.joining(","));
}

(pisane z paca, może sie nie skompilować, ale idea dobra ;) )

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