![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| simanyay |
|
||||
![]() Антон Ковалёв ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2053 Регистрация: 22.8.2002 Репутация: 3 Всего: 36 |
Если я это поле убираю, то появляется следующий warning:
Так зачем нужно это поле? Если мне не изменяет память, я раньше прекрасно обходился без него. У Эккеля не нашёл. В доках к JDK - не понял Eclipse 3.1M7 JDK Compliance: 5.0 Заранее спасибо. -------------------- «It's better to be a pirate than to join the Navy» — Steve Jobs. |
||||
|
|||||
| Andyb |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 170 Регистрация: 7.6.2004 Где: Lille, France Репутация: 4 Всего: 5 |
как я понимаю serialVersionUID это описание версии данного класса и является необязательным,
а warning'и генерирует Eclipse, в NetBeаns'е все компилиться без warning'ов в JBuilder'е тоже, а вот JCreator тоже плюется --------------------
Большинство наших ошибок происходит из-за невнимательности. |
|||
|
||||
| simanyay |
|
|||
![]() Антон Ковалёв ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2053 Регистрация: 22.8.2002 Репутация: 3 Всего: 36 |
Спасибо.
-------------------- «It's better to be a pirate than to join the Navy» — Steve Jobs. |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
serialVersionUID - это версия класса. При десериализации JVM проверяет версию класса десериализуемого объекта и сравнивает с версией загруженного класса, если они не совпадают, бросается иксепшн.
Если значения этого поля одинаковы, то считается что версии классов совместимы. Предположим , версия приложения 1.0 сериализует класс А, а в версии 2.0 этот класс изменен (добавили поле), то сама по себе JVM отказалась бы загрузить старые объекты класса А, поскольку на самом деле это разные классы. Но достаточно указать в А поле serialVersionUID, и не менять его в последующей версии, чтобы таким образом заставить JVM считать, что это объекты одного и того же класса. -------------------- |
|||
|
||||
| simanyay |
|
|||
![]() Антон Ковалёв ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2053 Регистрация: 22.8.2002 Репутация: 3 Всего: 36 |
Понятно, спасибо.
-------------------- «It's better to be a pirate than to join the Navy» — Steve Jobs. |
|||
|
||||
| carper |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 2.3.2005 Репутация: 1 Всего: 8 |
Domestic Cat
Что касается serialVersionUID все верно, но только, насколько я помню, эта переменная не только НЕ ОБЯЗАТЕЛЬНА, но, в общем случае, НЕ ЖЕЛАТЕЛЬНА с точки зрения гибкости и устранения возможных ошибок при изменении класса. А сам серийный номер генерится автоматически при каждом создании экземпляра (=> обычно статически задают номер только для классов, которые мы гарантированно не будем менять, с целью избегнуть затрат на автоматическую генерацию, ну, и еще несколько более экзотических вариантов можно придумать). Поэтому совершенно неясно почему это ругается компилятор ? Если посмотрим на стандартные классы SUN, расширяющие Exception, то и там находим, что serialVersionUID задается явно. Я, честно говоря, не совсем понимаю причину – разве, что исключения рассматриваются как потенциально неизменные объекты, находящие большое применение при сериализации + кажется сам механизм генерации SUID может отличаться для различных вариантов JVM, соотвественно компилятор от IBM на это и намекает. По крайней мере, IDEA в вышеприведенном примере не генерит никаких ошибок или предупреждений. P.S. Кстати, для генерации своего SUID разумно использовать serialver.exe все же от SUN – будет больше совместимости при разработке на разных IDE. |
|||
|
||||
| simanyay |
|
|||
![]() Антон Ковалёв ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2053 Регистрация: 22.8.2002 Репутация: 3 Всего: 36 |
Я не думаю, что разработчики Eclipse принуждали бы использовать нежелательные переменные. -------------------- «It's better to be a pirate than to join the Navy» — Steve Jobs. |
|||
|
||||
| carper |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 2.3.2005 Репутация: 1 Всего: 8 |
simanyay
" не думаю, что разработчики Eclipse принуждали бы использовать нежелательные переменные. " А они здесь не совсем "нежеланные", я не уверен в том, что правильно нашел причину этого явления, но полагаю, что виртуальная машина от IBM может использовать иную методику рассчета SUID, соот-но и приходится заботиться от совместимости со стандартной машиной от SUN. Хотя меня гложут смутные подозрения, что я горожу какую-то ересь. По крайней мере, методика подсчета от SUN весьма прозрачна и логична. Может здесь дело в том, что "хорошим тоном" для исключений де-факто приняли использовать статический номер, после чего Eclipse решил это правило довести "до уровня генерации предупреждения" |
|||
|
||||
| simanyay |
|
|||
![]() Антон Ковалёв ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2053 Регистрация: 22.8.2002 Репутация: 3 Всего: 36 |
Вот этот вариант мне больше всех импонирует -------------------- «It's better to be a pirate than to join the Navy» — Steve Jobs. |
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Не понял. Он используется тогда когда нужно обеспечить совместимость с предыдущими версиями, как он может повлиять на устранение ошибок? -------------------- |
|||
|
||||
| carper |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 2.3.2005 Репутация: 1 Всего: 8 |
Domestic Cat
"Он используется тогда когда нужно обеспечить совместимость с предыдущими версиями, как он может повлиять на устранение ошибок? " Боюсь, что это я невнятно выразился. Я имел в виду, ошибку программиста, заключающуюся в том, что он забыл сменить номер, обновив класс так, что это влияет на механизм сериализации. Соответственно, вместо того, чтобы схлопотать ошибку внешне все выглядит пристойно, только вот программа вдруг начинает себя вести как-то странно. Да и вообще, более логичным выглядело бы задание номера на классе реализущим не Serializable а Externalizable, по крайней мере, он жестче определяет поведение программиста в части самостоятельного использования readExternal и writeExternal (будете ли вы переопределять readObject и writeObject еще бабушка надвое сказала) , т.е. сложней будет забыть изменить номер. И все же меня заинтриговало решение самой SUN о явном задании номера классов- исключений. После отпуска попробую покопать, если чего найду с удовольствием сообщу. |
|||
|
||||
| inxaoc |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 17.6.2006 Репутация: нет Всего: нет |
Подскажите пожалуйста как генерить этот ID в Intellij Idea
|
|||
|
||||
| Shurr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 24.10.2006 Репутация: 5 Всего: 7 |
Есть специальный плагин GenerateSerialVersionUID. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |