|
|
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Привет, для меня всегда был очевиден ответ на вопрос, где и когда ставить serialVersionUID, но мой коллега был настолько уверен в обратном, что ... нужно мнение сообщество, вобщем. Ситуация - коллега добавил метод в класс и поменял ... serialVersionUID. Не поле добавил, а метод, просто метод. Как следствие клиент со старым кодом свалился на InvalidClassException. На вопрос "какого хрена" - "я всегда меня serialVersionUID и это правильно!" Ну хз, мне кажется он и был придуман, для совместимости классов, тем более stateless классов. Полезли в jls , там ни слова про необходимость изменения serialVersionUID при модификации методов, что, по-моему, логично. Есть мысли на этот счёт? я ничего не упускаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2013, 10:01 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Ваш вопрос не имеет однозначного ответа. Посмотрите внимательнее на ссылку, которую сами и привели - там ничего не говорится про то, что изменение методов является несовместимым изменением. НО! Там не говориться и того, что оно является совместимым! Все зависит от контекста. Может быть, там не только поменялся метод, но и то, что ожидается в определенных полях. Например, у вас было поле name, в котором ожидалось [Имя, Фамилия], а теперь там ожидается [Фамилия, Имя]. По формальным критериям с совместимостью ничего не произошло, а по факту - это может вызвать у вас проблемы, если какая-то ваша логика вне класса полагается на это. Поэтому нужно смотреть не на сам факт изменения метода, а на то, что эти изменения за собой влекут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.10.2013, 10:08 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
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 не поможет и клиент не сумеет создать класс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 00:59 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
J.SergeВерно, добавление метода (кроме private, вроде) влияет на сериализацию класса. С фига ли? По состоянию совместимость есть? Есть. Этого достаточно. Новый метод ни на что повлиять не может. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 10:58 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, serialver в руки для проверки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 12:56 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
J.Sergeserialver в руки для проверки Ааа... так речь про генерённый явой. Ну, этот да. Но логика ведь использовать serialVersionUID другая. Если класс Serializable, то девелоперы сами должны указывать и контролировать serialVersionUID. А не использовать внутренний. В этом случае простое добавление это совместимая модификация и пересоздавать serialVersionUID надобности нет. Иначе если свой serialVersionUID будет следовать логике генеренного serialVersionUID, то его суть совершенно теряется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.10.2013, 13:13 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, так всё таки если резюмировать когда надо явно менять serialVersionUID? Какие проблемы могут нас ожидать если мы оставим его вычисление на откуп компилятору? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2014, 17:49 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
redwhite90так всё таки если резюмировать когда надо явно менять serialVersionUID? Что значит "явно менять"? Возможно имелось ввиду "явно указывать"? Всегда когда у вас в коде Serializable класс. Исключение можно сделать для Swing классов. redwhite90Какие проблемы могут нас ожидать если мы оставим его вычисление на откуп компилятору? Такие что с выходом новой версии вашего ПО, данные старых версий не смогут быть прочитаны, даже если изменения в коде полностью совместимы между версиями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2014, 17:55 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Blazkowiczredwhite90так всё таки если резюмировать когда надо явно менять serialVersionUID? Что значит "явно менять"? Возможно имелось ввиду "явно указывать"? Всегда когда у вас в коде Serializable класс. Исключение можно сделать для Swing классов. имелось ввиду менять явно указанное значение. мне кажется хорошая статься по теме: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2014, 18:04 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2014, 18:04 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
redwhite90имелось ввиду менять явно указанное значение. Явно менять значение нужно, если у вас явно новая версия класса не совместима со старой. Поэтому старые сериализованые данные использовать нельзя. Поэтому вы меняете serialVersionUID, чтобы при попытке использования старых данных было исключение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2014, 18:42 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, BlazkowiczЯвно менять значение нужно, если у вас явно новая версия класса не совместима со старой когда новая версия класса не совместима со старой? по каким признакам это понять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2014, 19:07 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
redwhite90когда новая версия класса не совместима со старой? по каким признакам это понять? По таким, что десериализованая версия старого класса в новый класс приведет к дефектам ПО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2014, 20:15 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Есть какой то набор понятных случаев? Вы употребляете очень общие слова ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2014, 20:49 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Был объект юзер, добавили поле рейтинг Не поломается - если рейтинг передаем на юай только в json, и там есть проверка на нул Поломается - если в логике контроллеров есть логика зависящая от рейтинга. Очевидно же все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 00:13 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
redwhite90Есть какой то набор понятных случаев? Вы употребляете очень общие слова Явно надо менять, когда поменялось количество полей. Или имена полей. Раньше ещё был важен порядок, теперь нет. Или смысл полей. Хотя менять смысл без изменения названия очень плохо, но бывают нюансы. Потому что у данных есть ещё (возможно неявный) контракт. Например раньше некоторое поле могло принимать значение от 0 до 100, а теперь от 0 до 1000. И хотя это в коде никак не отражено (у нас не eiffel или ada, а java), но чтение старым кодом новой сущности приведёт к каким-то ошибкам. И разработчик может поменять SVUID, хотя формально всё осталось так же. Просто надо требовать ответа не "я всегда так делаю, потому что мне сказали так делать", а объяснения "почему". Понятно, что у равного себе особо не потребуешь, но для этого есть архитектор проекта, который такой вопрос должен задавать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 08:05 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
redwhite90Есть какой то набор понятных случаев? Вы употребляете очень общие слова "Ты не выёживайся, ты пальцем покажи?" Ну, если вы являетесь автором своего кода, разве вам не очевидно что именно вы в нём меняете? Если очевидно, что именно вы в неём поменяли, то можно написать test case или просто себе представить, как данные старого класса загрузятся в новый. Например, мы добавили метод в класс. Поля не поменялись. Поля это состояние. Значит состояние можно спокойно переносить между старой и новой версией. Значит UID менять не нужно. Мы добавили поле. В старой версии его нет. Значит после десериализации значение поля будет значением по-умолчанию. Это приведёт к ошибке? Если да, то меняем UID. Если значение по-умолчанию безопасно, то осталяем старый. Перенесли поле в другой класс. Значит из старой версии в новую оно из сериализованого состояния никак не попадёт. Если поле важно - меняем UID. Если не особо, то можно оставить старый. Где-то была толстая статья о том как сохранять backward compatibility. Если очень интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2014, 09:55 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, от статьи не откажусь. А можете тогда объяснить логику разраобтчиков языка меняющих serialver при добавлении метода? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2014, 15:28 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
redwhite90от статьи не откажусь. http://www.javapractices.com/topic/TopicAction.do?Id=45 redwhite90А можете тогда объяснить логику разраобтчиков языка меняющих serialver при добавлении метода? Так уж здесь повелось. Если в классе появился только новый метод, это ещё не значит что он совместим со старыми версиями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2014, 16:45 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Я вообще запутался. То BlazkowiczJ.SergeВерно, добавление метода (кроме private, вроде) влияет на сериализацию класса. С фига ли? По состоянию совместимость есть? Есть. Этого достаточно. Новый метод ни на что повлиять не может. А потом Blazkowicz...Если в классе появился только новый метод, это ещё не значит что он совместим со старыми версиями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2014, 04:40 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
J.Serge, Теория с практикой иногда расходятся. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2014, 09:35 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
J.SergeЯ вообще запутался. То Blazkowiczпропущено... С фига ли? По состоянию совместимость есть? Есть. Этого достаточно. Новый метод ни на что повлиять не может. А потом Blazkowicz...Если в классе появился только новый метод, это ещё не значит что он совместим со старыми версиями. может это связано с readObject and writeObject ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2014, 12:54 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
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 можете прояснить эти пункты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2014, 13:01 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
J.SergeЯ вообще запутался. То Blazkowiczпропущено... С фига ли? По состоянию совместимость есть? Есть. Этого достаточно. Новый метод ни на что повлиять не может. А потом Blazkowicz...Если в классе появился только новый метод, это ещё не значит что он совместим со старыми версиями. Ещё раз- у класса есть контракт. Он описывается не заголовками методов и полями классов, но и кодом. Если код (даже код!) поменялся, то старые методы других классов могут подавится новой версией. Т.к. контрактов в java нет (это могло бы спасти часто), то описать это можно только словами. Ну и сменой версии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2014, 18:55 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Alexey Tomin, Как новый метод, который не используется другими методами(что очевидно, он ведь новый) может повлиять на несовместимость? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2014, 22:30 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Наверное 30 минут вдумчивого чтения следующих сорцов будут полезнее криков - ну сколько можно, какого хрена e.t.c. ObjectOutputStream.java ObjectInputStream.java ObjectStreamConstants.java Здесь все ответы на ваши вопросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2014, 23:29 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
redwhite90Alexey Tomin, Как новый метод, который не используется другими методами(что очевидно, он ведь новый) может повлиять на несовместимость? Например метод выполняет некоторую проверку. Потом вызывается старый код, который меняет данные. А при возврате- вызывается новый метод, который не ожидал данные от старого метода. Понятно, пример искусственный. Но главное- что общего решения нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2014, 01:42 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
maytonНаверное 30 минут вдумчивого чтения следующих сорцов будут полезнее криков - ну сколько можно, какого хрена e.t.c. ObjectOutputStream.java ObjectInputStream.java ObjectStreamConstants.java Здесь все ответы на ваши вопросы. отличная мысль, черт побери! Только вдумчиво не читал, так пробежался. Но мысль отличная! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2014, 09:12 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Ну и слава богу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.07.2014, 16:54 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
redwhite90J.SergeЯ вообще запутался. То пропущено... А потом пропущено... может это связано с readObject and writeObject ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 16:44 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
redwhite90J.SergeЯ вообще запутался. То пропущено... А потом пропущено... может это связано с readObject and writeObject ? Не исключено :) Там еще есть readExternal и writeExternal - это вообще кошмар, я боюсь даже думать об этом... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 16:47 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Alexey TominЕщё раз- у класса есть контракт. Он описывается не заголовками методов и полями классов, но и кодом. Если код (даже код!) поменялся, то старые методы других классов могут подавится новой версией. Т.к. контрактов в java нет (это могло бы спасти часто), то описать это можно только словами. Ну и сменой версии. Alexey Tomin, "ты, конечно, вор авторитетный", но если Blazkowicz сказал в морг BlazkowiczС фига ли? По состоянию совместимость есть? Есть. Этого достаточно. Новый метод ни на что повлиять не может., значит в морг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 16:58 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
Делайте сериализацию в JSon, чортовы флудеры! Закройте уже этот бедный versionUID. Он не про вас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2014, 17:05 |
|
||
|
serialVersionUID ну сколько можно...
|
|||
|---|---|---|---|
|
#18+
J.SergeAlexey TominЕщё раз- у класса есть контракт. Он описывается не заголовками методов и полями классов, но и кодом. Если код (даже код!) поменялся, то старые методы других классов могут подавится новой версией. Т.к. контрактов в java нет (это могло бы спасти часто), то описать это можно только словами. Ну и сменой версии. Alexey Tomin, "ты, конечно, вор авторитетный", но если Blazkowicz сказал в морг BlazkowiczС фига ли? По состоянию совместимость есть? Есть. Этого достаточно. Новый метод ни на что повлиять не может., значит в морг Правда в 99.99% случаев. Но главное- любое решение должно быть обосновано. Если человек поменял SVUID - он должен внятно объяснить, зачем, почему класс потерял совместимость. Если не может- значит его надо отправить учить эту тему. Вот и всё. А что учить- тут mayton, Blazkowicz и прочие рассказали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2014, 09:48 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2126817]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
202ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
87ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 559ms |

| 0 / 0 |
