Używanie readClassDescriptor () i być może resolveClass () do zezwalania na wersjonowanie szeregowe

Badam różne opcje w mechanizmie szeregowania Java, aby umożliwić elastyczność w naszych strukturach klasowych dla pamięci tolerującej wersje (i zalecając inny mechanizm, nie musisz mi tego mówić).

Na przykład domyślny mechanizm serializacji może obsługiwać zarówno dodawanie, jak i usuwanie pól, jeśli wymagana jest tylko kompatybilność wsteczna.

Zmiana nazwy klasy lub przeniesienie jej do innego pakietu okazała się jednak znacznie trudniejsza. Znalazłem wto pytanie że udało mi się wykonać prostą zmianę nazwy klasy i / lub przenieść pakiet, podklasując ObjectInputStream i przesłaniając readClassDescriptor ():

    if (resultClassDescriptor.getName().equals("package.OldClass"))
        resultClassDescriptor = ObjectStreamClass.lookup(newpackage.NewClass.class);

To jest dobre dla prostych nazw. Jeśli jednak spróbujesz dodać lub usunąć pole, otrzymasz wyjątek java.io.StreamCorruptedException. Co gorsza, dzieje się tak nawet wtedy, gdy pole zostało dodane lub usunięte, inastępnie zmieniasz nazwę klasy, co może powodować problemy z wieloma programistami lub wieloma checkinami.

Opierając się na pewnym przeczytaniu, którego dokonałem, eksperymentowałem trochę z nadrzędnym resolveClass (), z myślą, że poprawnie przypisaliśmy nazwę do nowej klasy, ale nie ładowaliśmy samej starej klasy i nie bombardowaliśmy pola. Ale to wynika z bardzo niejasnego zrozumienia niektórych szczegółów mechanizmu serializacji i nie jestem pewien, czy nawet warknę właściwe drzewo.

Tak więc 2 dokładne pytania:

Dlaczego zmiana nazwy klasy za pomocą readClassDescriptor () powoduje niepowodzenie deserializacji w normalnych, zgodnych zmianach klas?Czy istnieje sposób użycia resolveClass () lub innego mechanizmu do obejścia tego i umożliwienia klasom zarówno ewolucji (dodawania i usuwania pól), jak i zmiany nazwy / przepakowania?

Zagrzebałem się i nie mogłem znaleźć równoważnego pytania na temat SO. W każdym razie, wskaż mi takie pytanie, jeśli istnieje, ale proszę uważnie przeczytaj pytanie, żebyś mnie nie zamknął, chyba że inne pytanie rzeczywiście odpowiada na moje dokładne pytanie.

questionAnswers(4)

yourAnswerToTheQuestion