Как у меня могут быть более гибкая сериализация и десериализация в Java?

Если я сериализирую объект в Java и затем позже добавляю дополнительное поле к классу Java, я не могу десериализовать объект в измененный класс.

Существует ли библиотека сериализации или некоторый способ, которым у меня может быть десериализация быть менее строгим, как то, если существует дополнительное поле, добавленное к классу затем, она просто заполняет это пустым указателем после десериализации старой версии класса?

5
задан Kyle 19 July 2010 в 20:28
поделиться

5 ответов

У вас много потенциальных вариантов.

Вы можете использовать библиотеку сериализации графов, чтобы определять свой формат и управлять им, например Буферы протокола Google или Kryo . Я считаю, что оба они имеют встроенную поддержку управления версиями.

Вы можете написать свой собственный код сериализации и явно обрабатывать версии - например, сериализация в гибкий формат, такой как XML. При чтении XML вы можете настроить его на использование значений по умолчанию, если конкретное поле не указано.

Или вы можете разработать свой класс «гибким» способом, например иметь все поля, хранящиеся в HashMap и проиндексированные строками. В зависимости от того, что вы пытаетесь сделать, это может быть удобным вариантом.

5
ответ дан 18 December 2019 в 14:41
поделиться

В вашем классе должен быть serialVersionUID . Посмотрите раздел «Контроль версий» в этой статье Sun .

7
ответ дан 18 December 2019 в 14:41
поделиться

Есть довольно много библиотек сериализации, хотя взгляните на Simple:

http://simple.sourceforge.net/

или, как упоминалось выше, буферы протокола Google.

http://code.google.com/apis/protocolbuffers/

1
ответ дан 18 December 2019 в 14:41
поделиться

Реализуйте Externalizable , и вы можете делать все, что захотите. Бремя сериализации / десериализации полностью возлагается на сериализуемый класс.

0
ответ дан 18 December 2019 в 14:41
поделиться

Вы добавляли serialVersionUID? Он должен присутствовать (и оставаться неизменным), если вы хотите сериализовать / десериализовать разные версии класса.

Кроме того, вы можете добавить в свой класс следующие два метода для точного определения процесса сериализации:

private void writeObject(java.io.ObjectOutputStream stream)
 throws IOException;
private void readObject(java.io.ObjectInputStream stream)
 throws IOException, ClassNotFoundException; 

Javadoc ObjectInputStream дает более подробную информацию о его использовании.

0
ответ дан 18 December 2019 в 14:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: