Если я сериализирую объект в Java и затем позже добавляю дополнительное поле к классу Java, я не могу десериализовать объект в измененный класс.
Существует ли библиотека сериализации или некоторый способ, которым у меня может быть десериализация быть менее строгим, как то, если существует дополнительное поле, добавленное к классу затем, она просто заполняет это пустым указателем после десериализации старой версии класса?
У вас много потенциальных вариантов.
Вы можете использовать библиотеку сериализации графов, чтобы определять свой формат и управлять им, например Буферы протокола Google или Kryo . Я считаю, что оба они имеют встроенную поддержку управления версиями.
Вы можете написать свой собственный код сериализации и явно обрабатывать версии - например, сериализация в гибкий формат, такой как XML. При чтении XML вы можете настроить его на использование значений по умолчанию, если конкретное поле не указано.
Или вы можете разработать свой класс «гибким» способом, например иметь все поля, хранящиеся в HashMap и проиндексированные строками. В зависимости от того, что вы пытаетесь сделать, это может быть удобным вариантом.
В вашем классе должен быть serialVersionUID
. Посмотрите раздел «Контроль версий» в этой статье Sun .
Есть довольно много библиотек сериализации, хотя взгляните на Simple:
http://simple.sourceforge.net/
или, как упоминалось выше, буферы протокола Google.
Реализуйте Externalizable , и вы можете делать все, что захотите. Бремя сериализации / десериализации полностью возлагается на сериализуемый класс.
Вы добавляли serialVersionUID? Он должен присутствовать (и оставаться неизменным), если вы хотите сериализовать / десериализовать разные версии класса.
Кроме того, вы можете добавить в свой класс следующие два метода для точного определения процесса сериализации:
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException;
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException;
Javadoc ObjectInputStream дает более подробную информацию о его использовании.