Использование readClassDescriptor () и, возможно, resolClass () для разрешения управления версиями сериализации

Я изучаю различные варианты в механизме Java Serialization, чтобы обеспечить гибкость в наших структурах классов для хранилища с поддержкой версий (и выступая за другой механизм, вам не нужно говорить мне).

Например, механизм сериализации по умолчанию может обрабатывать как добавление, так и удаление полей, если требуется только обратная совместимость.

Однако переименовать класс или переместить его в другой пакет оказалось гораздо сложнее. Я нашел вэтот вопрос что я смог сделать простое переименование класса и / или переместить пакет, создав подкласс ObjectInputStream и переопределив readClassDescriptor ():

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

Это хорошо для простых переименований. Но если вы затем попытаетесь добавить или удалить поле, вы получите исключение java.io.StreamCorruptedException. Хуже того, это происходит, даже если поле было добавлено или удалено, иthen вы переименовываете класс, что может вызвать проблемы с несколькими разработчиками или несколькими проверками.

Основываясь на чтении, которое я сделал, я немного поэкспериментировал с переопределением resolClass (), с идеей, что мы правильно переназначаем имя новому классу, но не загружаем сам старый класс и бомбим изменения полей. Но это происходит из-за очень смутного понимания некоторых деталей механизма сериализации, и я не уверен, что я даже лаю на правильное дерево.

Итак, 2 точных вопроса:

Why is repointing the class name using readClassDescriptor() causing deserialization to fail on normal, compatible class changes? Is there a way using resolveClass() or another mechanism to get around this and allow classes to both evolve (add and remove fields) and be renamed/repackaged?

Я осмотрелся и не смог найти эквивалентный вопрос по SO. Во что бы то ни стало, укажите мне на такой вопрос, если он существует, но, пожалуйста, прочитайте его достаточно внимательно, чтобы вы не закрыли меня, если другой вопрос не ответит на мой точный вопрос.

Ответы на вопрос(4)

Ваш ответ на вопрос