Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / serialVersionUID ну сколько можно... / 25 сообщений из 35, страница 1 из 2
29.10.2013, 10:01
    #38444494
Anatoly D
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
serialVersionUID ну сколько можно...
Привет, для меня всегда был очевиден ответ на вопрос, где и когда ставить serialVersionUID, но мой коллега был настолько уверен в обратном, что ... нужно мнение сообщество, вобщем.

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

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

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

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

Поэтому нужно смотреть не на сам факт изменения метода, а на то, что эти изменения за собой влекут.
...
Рейтинг: 0 / 0
30.10.2013, 00:59
    #38445985
J.Serge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
serialVersionUID ну сколько можно...
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
30.10.2013, 10:58
    #38446265
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
serialVersionUID ну сколько можно...
J.SergeВерно, добавление метода (кроме private, вроде) влияет на сериализацию класса.

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

может это связано с readObject and writeObject ?
...
Рейтинг: 0 / 0
28.07.2014, 13:01
    #38707208
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
serialVersionUID ну сколько можно...
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
28.07.2014, 18:55
    #38707577
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
serialVersionUID ну сколько можно...
J.SergeЯ вообще запутался. То
Blazkowiczпропущено...

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

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

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

Как новый метод, который не используется другими методами(что очевидно, он ведь новый) может повлиять на несовместимость?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / serialVersionUID ну сколько можно... / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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