powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / serialVersionUID ну сколько можно...
35 сообщений из 35, показаны все 2 страниц
serialVersionUID ну сколько можно...
    #38444494
Anatoly D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, для меня всегда был очевиден ответ на вопрос, где и когда ставить serialVersionUID, но мой коллега был настолько уверен в обратном, что ... нужно мнение сообщество, вобщем.

Ситуация - коллега добавил метод в класс и поменял ... serialVersionUID. Не поле добавил, а метод, просто метод. Как следствие клиент со старым кодом свалился на InvalidClassException.
На вопрос "какого хрена" - "я всегда меня serialVersionUID и это правильно!"

Ну хз, мне кажется он и был придуман, для совместимости классов, тем более stateless классов. Полезли в jls , там ни слова про необходимость изменения serialVersionUID при модификации методов, что, по-моему, логично.

Есть мысли на этот счёт? я ничего не упускаю?
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38444504
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ваш вопрос не имеет однозначного ответа. Посмотрите внимательнее на ссылку, которую сами и привели - там ничего не говорится про то, что изменение методов является несовместимым изменением. НО! Там не говориться и того, что оно является совместимым!

Все зависит от контекста. Может быть, там не только поменялся метод, но и то, что ожидается в определенных полях. Например, у вас было поле name, в котором ожидалось [Имя, Фамилия], а теперь там ожидается [Фамилия, Имя]. По формальным критериям с совместимостью ничего не произошло, а по факту - это может вызвать у вас проблемы, если какая-то ваша логика вне класса полагается на это.

Поэтому нужно смотреть не на сам факт изменения метода, а на то, что эти изменения за собой влекут.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38445985
J.Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly D..дoбавил метод в класс и поменял ... serialVersionUID. Не поле добавил, а метод, просто метод
Верно, добавление метода (кроме private, вроде) влияет на сериализацию класса.
Anatoly DПолезли в jls , там ни слова про необходимость изменения serialVersionUID при модификации методов, что, по-моему, логично.

И это верно - изменение метода НЕ влияет на сериализацию класса.

По своей ссылке смотри 4.6:
Java Object Serialization SpecificationThe stream-unique identifier is a 64-bit hash of the class name, interface class names, methods , and fields


Объявлять ли serialVersionUID явно и не менять его, это вопрос о том, нужно ли заставлять клиента верить, что в классе, приходящем с сервера, ничего не поменялось, когда изменения на самом деле есть. Не исключено, что возможна ситуация, когда изменения будут настолько серьезными, что неизмененный serialVersionUID не поможет и клиент не сумеет создать класс.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38446265
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J.SergeВерно, добавление метода (кроме private, вроде) влияет на сериализацию класса.

С фига ли? По состоянию совместимость есть? Есть. Этого достаточно. Новый метод ни на что повлиять не может.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38446486
J.Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

serialver в руки для проверки
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38446526
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J.Sergeserialver в руки для проверки
Ааа... так речь про генерённый явой. Ну, этот да. Но логика ведь использовать serialVersionUID другая.
Если класс Serializable, то девелоперы сами должны указывать и контролировать serialVersionUID. А не использовать внутренний.
В этом случае простое добавление это совместимая модификация и пересоздавать serialVersionUID надобности нет.
Иначе если свой serialVersionUID будет следовать логике генеренного serialVersionUID, то его суть совершенно теряется.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38704197
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

так всё таки если резюмировать когда надо явно менять serialVersionUID?

Какие проблемы могут нас ожидать если мы оставим его вычисление на откуп компилятору?
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38704202
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90так всё таки если резюмировать когда надо явно менять serialVersionUID?

Что значит "явно менять"? Возможно имелось ввиду "явно указывать"? Всегда когда у вас в коде Serializable класс. Исключение можно сделать для Swing классов.

redwhite90Какие проблемы могут нас ожидать если мы оставим его вычисление на откуп компилятору?
Такие что с выходом новой версии вашего ПО, данные старых версий не смогут быть прочитаны, даже если изменения в коде полностью совместимы между версиями.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38704210
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczredwhite90так всё таки если резюмировать когда надо явно менять serialVersionUID?

Что значит "явно менять"? Возможно имелось ввиду "явно указывать"? Всегда когда у вас в коде Serializable класс. Исключение можно сделать для Swing классов.


имелось ввиду менять явно указанное значение.

мне кажется хорошая статься по теме:
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38704211
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38704232
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90имелось ввиду менять явно указанное значение.

Явно менять значение нужно, если у вас явно новая версия класса не совместима со старой. Поэтому старые сериализованые данные использовать нельзя. Поэтому вы меняете serialVersionUID, чтобы при попытке использования старых данных было исключение.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38704251
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

BlazkowiczЯвно менять значение нужно, если у вас явно новая версия класса не совместима со старой

когда новая версия класса не совместима со старой? по каким признакам это понять?
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38704289
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90когда новая версия класса не совместима со старой? по каким признакам это понять?
По таким, что десериализованая версия старого класса в новый класс приведет к дефектам ПО.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38704310
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть какой то набор понятных случаев? Вы употребляете очень общие слова
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38704390
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Был объект юзер, добавили поле рейтинг

Не поломается - если рейтинг передаем на юай только в json, и там есть проверка на нул
Поломается - если в логике контроллеров есть логика зависящая от рейтинга.

Очевидно же все.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38704461
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Есть какой то набор понятных случаев? Вы употребляете очень общие слова

Явно надо менять, когда поменялось количество полей. Или имена полей. Раньше ещё был важен порядок, теперь нет.

Или смысл полей. Хотя менять смысл без изменения названия очень плохо, но бывают нюансы. Потому что у данных есть ещё (возможно неявный) контракт. Например раньше некоторое поле могло принимать значение от 0 до 100, а теперь от 0 до 1000. И хотя это в коде никак не отражено (у нас не eiffel или ada, а java), но чтение старым кодом новой сущности приведёт к каким-то ошибкам. И разработчик может поменять SVUID, хотя формально всё осталось так же.

Просто надо требовать ответа не "я всегда так делаю, потому что мне сказали так делать", а объяснения "почему". Понятно, что у равного себе особо не потребуешь, но для этого есть архитектор проекта, который такой вопрос должен задавать.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38704551
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Есть какой то набор понятных случаев? Вы употребляете очень общие слова
"Ты не выёживайся, ты пальцем покажи?"
Ну, если вы являетесь автором своего кода, разве вам не очевидно что именно вы в нём меняете?
Если очевидно, что именно вы в неём поменяли, то можно написать test case или просто себе представить, как данные старого класса загрузятся в новый.

Например, мы добавили метод в класс. Поля не поменялись. Поля это состояние. Значит состояние можно спокойно переносить между старой и новой версией. Значит UID менять не нужно.
Мы добавили поле. В старой версии его нет. Значит после десериализации значение поля будет значением по-умолчанию. Это приведёт к ошибке? Если да, то меняем UID. Если значение по-умолчанию безопасно, то осталяем старый.
Перенесли поле в другой класс. Значит из старой версии в новую оно из сериализованого состояния никак не попадёт. Если поле важно - меняем UID. Если не особо, то можно оставить старый.

Где-то была толстая статья о том как сохранять backward compatibility. Если очень интересно.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38706087
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

от статьи не откажусь.

А можете тогда объяснить логику разраобтчиков языка меняющих serialver при добавлении метода?
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38706197
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90от статьи не откажусь.

http://www.javapractices.com/topic/TopicAction.do?Id=45

redwhite90А можете тогда объяснить логику разраобтчиков языка меняющих serialver при добавлении метода?
Так уж здесь повелось. Если в классе появился только новый метод, это ещё не значит что он совместим со старыми версиями.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38706453
J.Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вообще запутался. То
BlazkowiczJ.SergeВерно, добавление метода (кроме private, вроде) влияет на сериализацию класса.

С фига ли? По состоянию совместимость есть? Есть. Этого достаточно. Новый метод ни на что повлиять не может.

А потом
Blazkowicz...Если в классе появился только новый метод, это ещё не значит что он совместим со старыми версиями.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38706474
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J.Serge,

Теория с практикой иногда расходятся. :)
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38707199
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
J.SergeЯ вообще запутался. То
Blazkowiczпропущено...

С фига ли? По состоянию совместимость есть? Есть. Этого достаточно. Новый метод ни на что повлиять не может.

А потом
Blazkowicz...Если в классе появился только новый метод, это ещё не значит что он совместим со старыми версиями.

может это связано с readObject and writeObject ?
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38707208
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
по повроду статьи
http://www.javapractices.com/topic/TopicAction.do?Id=45 -deserialization must be treated as any constructor: validate the object state at the end of deserializing - this implies that readObject should almost always be implemented in Serializable classes, such that this validation is performed.

-deserialization must be treated as any constructor: if constructors make defensive copies for mutable object fields, so must readObject

-container classes should usually follow the style of Hashtable, which implements Serializable by storing keys and values, as opposed to a large hash table data structure


можете прояснить эти пункты?
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38707577
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J.SergeЯ вообще запутался. То
Blazkowiczпропущено...

С фига ли? По состоянию совместимость есть? Есть. Этого достаточно. Новый метод ни на что повлиять не может.

А потом
Blazkowicz...Если в классе появился только новый метод, это ещё не значит что он совместим со старыми версиями.

Ещё раз- у класса есть контракт. Он описывается не заголовками методов и полями классов, но и кодом. Если код (даже код!) поменялся, то старые методы других классов могут подавится новой версией.
Т.к. контрактов в java нет (это могло бы спасти часто), то описать это можно только словами. Ну и сменой версии.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38707664
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexey Tomin,

Как новый метод, который не используется другими методами(что очевидно, он ведь новый) может повлиять на несовместимость?
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38707686
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное 30 минут вдумчивого чтения следующих сорцов будут полезнее
криков - ну сколько можно, какого хрена e.t.c.

ObjectOutputStream.java
ObjectInputStream.java
ObjectStreamConstants.java

Здесь все ответы на ваши вопросы.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38707699
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Alexey Tomin,

Как новый метод, который не используется другими методами(что очевидно, он ведь новый) может повлиять на несовместимость?

Например метод выполняет некоторую проверку. Потом вызывается старый код, который меняет данные. А при возврате- вызывается новый метод, который не ожидал данные от старого метода.
Понятно, пример искусственный. Но главное- что общего решения нет.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38707779
Anatoly D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonНаверное 30 минут вдумчивого чтения следующих сорцов будут полезнее
криков - ну сколько можно, какого хрена e.t.c.

ObjectOutputStream.java
ObjectInputStream.java
ObjectStreamConstants.java

Здесь все ответы на ваши вопросы.

отличная мысль, черт побери!

Только вдумчиво не читал, так пробежался. Но мысль отличная! :)
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38708369
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и слава богу
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38709264
J.Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90J.SergeЯ вообще запутался. То
пропущено...


А потом
пропущено...


может это связано с readObject and writeObject ?
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38709267
J.Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90J.SergeЯ вообще запутался. То
пропущено...


А потом
пропущено...


может это связано с readObject and writeObject ?

Не исключено :) Там еще есть readExternal и writeExternal - это вообще кошмар, я боюсь даже думать об этом...
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38709275
J.Serge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominЕщё раз- у класса есть контракт. Он описывается не заголовками методов и полями классов, но и кодом. Если код (даже код!) поменялся, то старые методы других классов могут подавится новой версией.
Т.к. контрактов в java нет (это могло бы спасти часто), то описать это можно только словами. Ну и сменой версии.

Alexey Tomin, "ты, конечно, вор авторитетный", но если Blazkowicz сказал в морг

BlazkowiczС фига ли? По состоянию совместимость есть? Есть. Этого достаточно. Новый метод ни на что повлиять не может.,
значит в морг
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38709286
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делайте сериализацию в JSon, чортовы флудеры! Закройте уже этот бедный versionUID. Он не про вас.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38709713
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
J.SergeAlexey TominЕщё раз- у класса есть контракт. Он описывается не заголовками методов и полями классов, но и кодом. Если код (даже код!) поменялся, то старые методы других классов могут подавится новой версией.
Т.к. контрактов в java нет (это могло бы спасти часто), то описать это можно только словами. Ну и сменой версии.

Alexey Tomin, "ты, конечно, вор авторитетный", но если Blazkowicz сказал в морг

BlazkowiczС фига ли? По состоянию совместимость есть? Есть. Этого достаточно. Новый метод ни на что повлиять не может.,
значит в морг

Правда в 99.99% случаев.

Но главное- любое решение должно быть обосновано. Если человек поменял SVUID - он должен внятно объяснить, зачем, почему класс потерял совместимость. Если не может- значит его надо отправить учить эту тему. Вот и всё. А что учить- тут mayton, Blazkowicz и прочие рассказали.
...
Рейтинг: 0 / 0
serialVersionUID ну сколько можно...
    #38709762
Anatoly D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonДелайте сериализацию в JSon, чортовы флудеры! Закройте уже этот бедный versionUID. Он не про вас.
нет, нет. пусть Alexey Tomin выскажется :)
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / serialVersionUID ну сколько можно...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]