Serializacja i zmiany w klasie.

0

Nie wiem jak zatytułować tego posta prosto i zrozumiale, ale może wyklaruję tutaj o co mi chodzi: napisałem program, który coś tam robi. Wszystkie dane na których pracuje program trzyma w obiekcie klasy "Projekt". Korzystając z "Serializable" łatwo zapisuję sobie projekt do pliku, aby kolejnego dnia załadować go sobie z powrotem i pracować na mim dalej. Ale program się rozwija i pojawia się koniecznośc przerobienia klasy "Projekt". W tym momencie nowa wersja programu nie będzie już chciała deserializować plików projektu utworzonego przez starsze wersje programu - a bardzo bym chciał aby tak było - to znaczy aby deserializował. Problem w tym że nie wiem jak zabrać się do rozwiązania tego problemu. Można liczyć na jakieś wskazówki?

Jarek

0

zrezygnuj z serializacji calego obiektu, ustal sobie jakas stala strukture danych, niezalezna od konkretniej implementacji klasy Projekt.
Stworz sobie podzial - Projekt <-> Dane_projektu <-> zrodlo_danych, gdzie Dane_projektu moze byc klasa o stalym interfejsie, w ten sposob mozesz dowolnie zmieniac implementacje klasy Projekt, a reszta zostanie bez zmian.

0

To nie jest takie hop siup. Po pierwsze wraz z interfejsem Serializable masz serialVersionUID, który odpowiada za "wersjonowanie" klasy. Prawidłowo wdrożony system wraz z każdą nową wersją powinien mieć taką operację jak zmiana wartości serialVersionUID. Wtedy wszystkie starsze wersje będą prawidłowo się zachowywać tzn. jawnie wysypywać.

Rozwiązania problemu są różne.

Po pierwsze nie serializuj obiektu, ale dane do np. pliku XML.
Po drugie napisz własną serializację, która na podstawie odczytanej wartości serialVersionUID będzie wstanie odczytać obiekt w starej wersji i na jego podstawie przekonwertować go do nowej wersji.
Po trzecie nie zmieniaj obiektu, ale rozszerzaj go. Jest takie coś jak Open-close Principle, która prawidłowo stosowana w tym przypadku będzie opierać się właśnie o rozszerzanie starej klasy.

0

A już myślałem, że hop siup :-( no cóż, wygląda na to że jeszcze trochę pracy zostało. Dziękuję za wskazówki.

0

A jednak a jednak! No może nie do końca rozwiązuje to problem o którym pisałem na początku, ale w dużym stopniu ułatwia życie. Wczoraj wpadłem na taki tekst:

http://java.sun.com/developer/technicalArticles/Programming/serialization/

z którego wynika, że wystarczy w kodzie klasy wprowadzić zmienną "serialVersionUID", co pozwoli pomimo zmian w klasie zachować stałe serialVersionUID. Oczywiście jest też mowa o kompatybilności zmian wprowadzanych do klasy, ale w moim przypadku zmiany są jak najbardziej kompatybilne. Więc do pewnego momentu można na tym mechaniźmie bazować. Zrobiłem tak i działa.

Pozdrawiam!

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