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