Подтвердить что ты не робот

Является ли совместимость Java-объектов между 1.5 и 1.6

Мне интересно, можно ли смешивать сериализацию объектов jdk 1.5 и 1.6 (Java 6) (бинаучная связь). Я искал явное утверждение солнца по этому вопросу, но не получилось. Поэтому, помимо технической выполнимости, я ищу "официальное" выражение о проблеме.

4b9b3361

Ответ 1

Сам механизм сериализации не изменился. Для отдельных классов это будет зависеть от конкретного класса. Если класс имеет поле serialVersionUID, это должно указывать на совместимость с сериализацией.

Что-то вроде:

private static final long serialVersionUID = 8683452581122892189L;

Если он не изменился, сериализованные версии совместимы. Для классов JDK это гарантировано, но, конечно, всегда можно забыть обновить serialVersionUID после внесения изменений.

Если классы JDK не гарантируют совместимость, это обычно упоминается в Javadoc.

Предупреждение. Сериализованные объекты этого класса не будут совместимы с будущими версиями Swing

Ответ 2

Механизм сериализации в 1.5 и 1.6 совместим. Таким образом, тот же код, скомпилированный/работающий в контексте 1.5 и 1.6, может обмениваться сериализованными объектами. Являются ли два экземпляра VM одинаковой/совместимой версией класса (как может указывать поле serialVersionUID) - это другой вопрос, не связанный с версией JDK.

Если у вас есть сериализуемая Foo.java и используйте это в 1.5 и 1.6 JDK/VM, сериализованные экземпляры Foo, созданные одним V; может быть десериализован другим.

Ответ 3

После тестирования с помощью сериализованного объекта, записанного в файл с использованием ObjectOutputStream в программе Java 1.5, затем выполните чтение с помощью ObjectInputStream в программе Java 1.6, я могу сказать, что это сработало без каких-либо проблем.

Ответ 4

Я бы быстро добавил, что можно изменить класс, но забыть изменить serialVersionUID. Поэтому неверно: "Если класс определяет serialVersionUID, и это не изменяется, класс гарантированно совместим". Скорее, наличие того же serialVersionUID является способом обратной совместимости API promises.

Ответ 5

Если не указано иное, это должно быть частью двоичной совместимости. Классы Swing явно не совместимы между версиями. Если вы обнаружили проблему с другими классами, сообщите об ошибке bugs.sun.com.

Ответ 6

Вы прочитали спецификацию сериализации Java-объектов? Существует тема версия. Существует также статья для исполнителей классов: Откройте секреты API Java Serialization. Каждый выпуск Java сопровождается примечаниями по совместимости.

Из спецификации Java 6 для сериализации:


Цели заключаются в следующем:

  • Поддержка двунаправленной связи между различными версиями класса, работающего на разных виртуальных машинах, посредством:
    • Определение механизма, позволяющего классам JavaTM читать потоки, написанные более старыми версиями одного и того же класса.
    • Определение механизма, позволяющего классам JavaTM записывать потоки, предназначенные для чтения более старыми версиями одного и того же класса.
  • Обеспечьте сериализацию по умолчанию для сохранения и для RMI.
  • Хорошо выполняйте и создавайте компактные потоки в простых случаях, чтобы RMI мог использовать сериализацию.
  • Уметь идентифицировать и загружать классы, соответствующие точному классу, используемому для записи потока.
  • Сохраняйте верхний минимум для непереведенных классов.
  • Используйте формат потока, который позволяет обходить поток без необходимости использовать методы, специфичные для объектов, сохраненных в потоке.

Ответ 7

Обратите внимание, что спецификация Java Beans описывает независимый от версии метод сериализации, который обеспечивает сильную обратную совместимость. Это также дает читаемые "сериализованные" формы. Фактически сериализованный объект можно легко создать с помощью механизма.

Посмотрите документацию на классы XMLEncoder и XMLDecoder.

Я бы не использовал это для передачи объекта по каналу обязательно (хотя, если высокая производительность является требованием, я бы тоже не использовал сериализацию), но он неоценим для постоянного хранения объектов.

Ответ 8

Нельзя смешивать java 1.5 и 1.6. Например, у меня есть объекты Java 1.5, сериализованные в файл, и попытались открыть в java 1.6, но при этом возникла ошибка ниже.

java.io.InvalidClassException: javax.swing.JComponent; локальный класс несовместим: stream classdesc serialVersionUID = 7917968344860800289, локальный класс serialVersionUID = -1030230214076481435   в java.io.ObjectStreamClass.initNonProxy(Неизвестный источник)   в java.io.ObjectInputStream.readNonProxyDesc(Неизвестный источник)   в java.io.ObjectInputStream.readClassDesc(Неизвестный источник)   в java.io.ObjectInputStream.readNonProxyDesc(Неизвестный источник)   в java.io.ObjectInputStream.readClassDesc(Неизвестный источник)   в java.io.ObjectInputStream.readNonProxyDesc(Неизвестный источник)   в java.io.ObjectInputStream.readClassDesc(Неизвестный источник)   в java.io.ObjectInputStream.readOrdinaryObject(Неизвестный источник)   в java.io.ObjectInputStream.readObject0 (Неизвестный источник)   в java.io.ObjectInputStream.readArray(Неизвестный источник)   в java.io.ObjectInputStream.readObject0 (Неизвестный источник)   в java.io.ObjectInputStream.defaultReadFields(Неизвестный источник)   в java.io.ObjectInputStream.readSerialData(Неизвестный источник)   в java.io.ObjectInputStream.readOrdinaryObject(Неизвестный источник)   в java.io.ObjectInputStream.readObject0 (Неизвестный источник)   в java.io.ObjectInputStream.defaultReadFields(Неизвестный источник)   в java.io.ObjectInputStream.readSerialData(Неизвестный источник)   в java.io.ObjectInputStream.readOrdinaryObject(Неизвестный источник)   в java.io.ObjectInputStream.readObject0 (Неизвестный источник)   в java.io.ObjectInputStream.readArray(Неизвестный источник)   в java.io.ObjectInputStream.readObject0 (Неизвестный источник)   в java.io.ObjectInputStream.defaultReadFields(Неизвестный источник)   в java.io.ObjectInputStream.readSerialData(Неизвестный источник)   в java.io.ObjectInputStream.readOrdinaryObject(Неизвестный источник)   в java.io.ObjectInputStream.readObject0 (Неизвестный источник)   в java.io.ObjectInputStream.readObject(Неизвестный источник)