У меня есть вопрос о сериализации Java в сценариях, где вам может потребоваться изменить ваш сериализуемый класс и поддерживать обратную совместимость.
Я прихожу из глубокого опыта С#, поэтому, пожалуйста, позвольте мне сравнить Java с .NET.
В моем сценарии Java мне нужно сериализовать объект с механизмом сериализации Java runtime и сохранить двоичные данные в постоянном хранилище для повторного использования объектов в будущем. Проблема в том, что в будущем классы могут подвергаться изменениям. Поля могут быть добавлены или удалены.
Я не знаю сериализацию Java в глубине, за исключением этой фантастической статьи о том, как не программировать в Java при работе с сериализацией, Как я полагаю (d), serialVersionUID играет ключевую роль в сериализации Java, и именно здесь мне нужна ваша помощь.
Помимо примера статьи (я знаю, что это плохое кодирование), это поле не будет изменено, когда Eclipse попросит его обновить после изменения класса?
Я помню из мира .NET, что при добавлении новых полей я должен добавить атрибут [OptionalField]
в поле, чтобы получить обратную совместимость, поэтому CLR не потребует его в старых сериализованных данных. Кроме того, когда мне нужно отказаться от поля, я должен удалить только общедоступные методы, а не частные поля.
Каковы рекомендации по лучшей сериализации?
Спасибо.
[Добавить] Вот пример. Предположим, что у меня есть класс Foo
public class Foo {
private String bar;
}
Затем я перехожу к:
public class Foo {
private String bar;
private Integer eggs;
}
Совместимость между этими двумя версиями? Если я десериализую "oldFoo", когда у меня скомпилирован "newFoo", яйца равны нулю или вызывается исключение? Я предпочитаю первый, очевидно!!