Serializacja zmiana pól klasy a odczyt danych

0

Witam,
mam pytanie odnosnie serializacji.
Jest klasa implementujaca Serializable posiadajaca pola:
Imie, Nazwisko, Wiek, Data Urodzenia
Dane sa juz zapisane w pliku.
Chcialbym dodac do klasy kolejne pole, np plec.
Tylko po zmianie nie laduja sie dane zapisane w pierwotnej wersji.
Jak to zrobic aby stare dane nadal mozna bylo odczytac bez pola plec, albo dodac do nich pole plec z domyslna wartoscia ?

Z gory dzieki za pomoc

3

Klasyczny problem serializacji w Javie (w sumie jej nieprawidłowego wykorzystania, do zapisu danych). Odpowiedź krótka – nie da się. Odpowiedź dłuższa – da się, ale to skomplikowane.

  1. Ładujesz swoje obiekty z pliku.
  2. Zapisujesz w postaci np. JSON, csv, czy innej, która nie opiera się o serializację java.
  3. Dokonujesz zmian w swojej klasie.
  4. Cieszysz się z nowego kodu.
  5. Przyszłe zapisy robisz do sensownego formatu.

Dlaczego wspomniałem, że serializacja jest nieprawidłowo wykorzystywana? Ano dlatego, że nie do końca była ona wymyślona do prostego zapisu danych na dysk. Serializacja została zaprojektowana z myślą o komunikacji sieciowej, a mechanizm weryfikujący poprawność klasy (sławetny SerialVesionUID) miał gwarantować, że komunikujące się programy mają tę samą wersję klasy.
Niestety wszystkie tutoriale pokazują, jak zapisywać dane do pliku, bo to jest bardzo proste do ogarnięcia. Nie wymaga poruszania tematów związanych z komunikacją sieciową.

0

@Koziołek: ok, nie robi sie tego ale jak sobie z tym poradzic jak juz jest duzy plik i trzeba go deserializowac i dodac kolejne dane

1

@Sa1rus: możesz na przykład wykorzystać produkt @jarekr000000, czyli Airomem. Jak nie chcesz wykorzystywać Airomema, to możesz wykorzystać alternatywną implementację serializacji, czyli Kryo.

Tyle o tym co możesz zrobić. Pytanie, czy twój kod jest podatny na modyfikacje tego typu. Czy też jest zabetonowany i refaktoring będzie trudny.

2

ok, nie robi sie tego ale jak sobie z tym poradzic jak juz jest duzy plik i trzeba go deserializowac i dodac kolejne dane

To brzmi jak baza danych, więc może zamiast cudować użyj jakiegoś h2 z bazą w pliku?

0

@Koziołek: A jesli wykorzystalbym dziedziczenie, tzn stworzyl klase z dodatkowymi polami ktora bedzie dziedziczyla z klasy pierwotnej, nastepnie stare dane zparsowalbym na nowa klase i ponownie uzyl serializacji ?

P.S Baza pewnie bylaby najprostsza i i na pewno masz racje ale czy to co wyskrobalem powyzej ma jakis sens ?

1

@Sa1rus: nie ma sensu, bo używasz serializacji, która tylko potęguje problemy. Zła technologia.

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