Сериализация объекта Java, совместимая между 1,5 и 1.6

ваш params missiong topic_ids вы можете добавить его, как пример кода ниже

def user_params
  params.require(:user).permit(
  :name, :email, :password,
  :password_confirmation, topic_ids: [])
end

Редактировать:

Я думаю, ваш контроллер обновлений уже верен, другую альтернативу для пользователя, чтобы выбрать тему вы можете используйте collection_select

 <%= f.collection_select :topic_ids, Topic.all.sample(50), :id, :topic_name, {}, { multiple: true } %>
20
задан 30 September 2008 в 12:07
поделиться

8 ответов

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

Что-то как:

private static final long serialVersionUID = 8683452581122892189L;

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

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

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

16
ответ дан 30 November 2019 в 00:48
поделиться

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

java.io.InvalidClassException: javax.swing.JComponent; local class incompatible: stream classdesc serialVersionUID = 7917968344860800289, local class serialVersionUID = -1030230214076481435
    at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readArray(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readArray(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
0
ответ дан 30 November 2019 в 00:48
поделиться

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

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

3
ответ дан 30 November 2019 в 00:48
поделиться

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

2
ответ дан 30 November 2019 в 00:48
поделиться

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

2
ответ дан 30 November 2019 в 00:48
поделиться

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

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

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

0
ответ дан 30 November 2019 в 00:48
поделиться

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

2
ответ дан 30 November 2019 в 00:48
поделиться

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

совместимости

От спецификации Java 6 на сериализации:

<час>

цели к:

  • двунаправленная связь Поддержки между различными версиями класса, работающего в различных виртуальных машинах:
    • Определение механизма, который позволяет потоки классов чтения JavaTM, записанные более старыми версиями того же класса.
    • Определение механизма, который позволяет потоки классов записи JavaTM, намеревалось быть считанным более старыми версиями того же класса.
  • Обеспечивают сериализацию по умолчанию для персистентности и для RMI.
  • Работают хорошо и производят компактные потоки в простых случаях, так, чтобы RMI мог использовать сериализацию.
  • Смочь определить и загрузить классы, которые соответствуют точному классу, раньше писал поток.
  • Поддерживают издержки на низком уровне для неимеющих версию классов.
  • Использование потоковый формат, который позволяет обход потока, не имея необходимость вызывать методы, характерные для объектов, сохраненных в потоке.
<час>
2
ответ дан 30 November 2019 в 00:48
поделиться
Другие вопросы по тегам:

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