У меня есть класс Java, который хранится в объекте HttpSession, который сериализуется и передается между серверами в среде кластера. Для целей этого объяснения позвольте назвать этот класс "Человек".
В процессе улучшения кода этот класс был перемещен из "com.acme.Person" в "com.acme.entity.Person". Внутри класс остается точно таким же (одни и те же поля, одни и те же методы, все одинаковое).
Проблема в том, что у нас есть два набора серверов, на которых запущен старый код и новый код. Серверы со старым кодом имеют сериализованный объект HttpSession, и когда новый код неэтериализует его, он выдает исключение ClassNotFoundException, потому что он не может найти старую ссылку на com.acme.Person. На этом этапе легко справиться с этим, потому что мы можем просто воссоздать объект, используя новый пакет. Затем возникает проблема, связанная с тем, что HttpSession на новых серверах будет сериализовать объект с новой ссылкой на com.acme.entity.Person, и когда это будет неэтериализовано на серверах, на которых запущен старый код, будет выбрано другое исключение. На этом этапе мы больше не можем справляться с этим исключением.
Какая лучшая стратегия для подобных случаев? Есть ли способ рассказать новым серверам о сериализации объекта со ссылкой на старый пакет и неэтериализовать ссылки на старый пакет на новый? Как мы перейдем к использованию нового пакета и забудем о старом, как только все серверы запустит новый код?