Мы используем Kryo для сериализации больших java объектов при передаче их в HTTP-запросе между несколькими клиентами и одним общим сервером.
Допустим, например, мы сериализуем объект следующим образом:
class Person {
private long id;
private String name;
public Person() {
}
}
Теперь у нас есть две основные проблемы, которые вызывают сильную головную боль и дополнительное кодирование:
, когда нам нужно изменить объект Person
(например, добавить новое поле) ) - для обеспечения обратной совместимости со старыми клиентами, которые все еще используют старый Person
объект - мы создаем еще один Person
класс (v2.Person
).
Затем мы десериализуем данные от старых клиентов, использующих старый Person
, и от новых клиентов, использующих v2.Person
. Это создает много дублирования кода.
Если, например, я перемещаю объект v2.Person
в другой пакет, это вызывает следующие проблемы:
say Я переместил класс с old_pacakge.v2.Person
на new_package.v2.Person
. Когда я пытаюсь десериализовать объект v2.Person
, исходящий от клиента, - я получаю ClassNotFoundException: old_pacakge.v2.Person
.
Чтобы уточнить - клиент использует объект Person
из jar зависимостей, созданный кодом сервера .
Я знаю, что это потому, что при сериализации , крио пишет имя класса, а при десериализации он пытается найти этот класс в пути к классам. и терпит неудачу (потому что v2.Person
перемещено).
В идеале - я хотел бы иметь возможность сериализовать класс с определенной структурой - и десериализовать его с другим классом, который имеет такую же структуру , но не в зависимости от местоположения класса .
Мы не смогли решить эти две проблемы. Мы много читали о Kryo и о том, как люди решают проблемы обратной совместимости, но обнаружили, что у многих людей есть такие же проблемы, и они не могут найти простые / стандартные решения.
Существуют ли стандартные / лучшие практики для решения этих проблем?