Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание собственных исключений, а конкретно поле serialVersionUID 
:(
    Опции темы
simanyay
  Дата 30.6.2005, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


Профиль
Группа: Участник
Сообщений: 2053
Регистрация: 22.8.2002

Репутация: 3
Всего: 36



Код

package org.simanyay.jizer.kernel;

public class CompilerException extends Exception {
    private static final long serialVersionUID = 42L; // Зачем вот это нужно?
    
    public CompilerException() {
    }
    
    public CompilerException(String msg) {
        super(msg);
    }

    // bla-bla
}


Если я это поле убираю, то появляется следующий warning:
Цитата
The serializable class CompilerException does not declare a static final serialVersionUID field of type
long


Так зачем нужно это поле? Если мне не изменяет память, я раньше прекрасно обходился без него. У Эккеля не нашёл. В доках к JDK - не понял smile

Eclipse 3.1M7
JDK Compliance: 5.0

Заранее спасибо.


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
Andyb
Дата 30.6.2005, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 170
Регистрация: 7.6.2004
Где: Lille, France

Репутация: 4
Всего: 5



как я понимаю serialVersionUID это описание версии данного класса и является необязательным,
а warning'и генерирует Eclipse, в NetBeаns'е все компилиться без warning'ов в JBuilder'е тоже,
а вот JCreator тоже плюется
--------------------
 Большинство наших ошибок происходит из-за невнимательности.
PM ICQ   Вверх
simanyay
Дата 30.6.2005, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


Профиль
Группа: Участник
Сообщений: 2053
Регистрация: 22.8.2002

Репутация: 3
Всего: 36



Спасибо.


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
Domestic Cat
Дата 1.7.2005, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



serialVersionUID - это версия класса. При десериализации JVM проверяет версию класса десериализуемого объекта и сравнивает с версией загруженного класса, если они не совпадают, бросается иксепшн.
Если значения этого поля одинаковы, то считается что версии классов совместимы. Предположим , версия приложения 1.0 сериализует класс А, а в версии 2.0 этот класс изменен (добавили поле), то сама по себе JVM отказалась бы загрузить старые объекты класса А, поскольку на самом деле это разные классы. Но достаточно указать в А поле serialVersionUID, и не менять его в последующей версии, чтобы таким образом заставить JVM считать, что это объекты одного и того же класса.


--------------------

PM   Вверх
simanyay
Дата 1.7.2005, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


Профиль
Группа: Участник
Сообщений: 2053
Регистрация: 22.8.2002

Репутация: 3
Всего: 36



Понятно, спасибо.


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
carper
Дата 5.7.2005, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 1
Всего: 8



Domestic Cat
Что касается serialVersionUID все верно, но только, насколько я помню, эта переменная не только НЕ ОБЯЗАТЕЛЬНА, но, в общем случае, НЕ ЖЕЛАТЕЛЬНА с точки зрения гибкости и устранения возможных ошибок при изменении класса.
А сам серийный номер генерится автоматически при каждом создании экземпляра (=> обычно статически задают номер только для классов, которые мы гарантированно не будем менять, с целью избегнуть затрат на автоматическую генерацию, ну, и еще несколько более экзотических вариантов можно придумать).

Поэтому совершенно неясно почему это ругается компилятор ?

Если посмотрим на стандартные классы SUN, расширяющие Exception, то и там находим, что serialVersionUID задается явно.

Я, честно говоря, не совсем понимаю причину – разве, что исключения рассматриваются как потенциально неизменные объекты, находящие большое применение при сериализации + кажется сам механизм генерации SUID может отличаться для различных вариантов JVM, соотвественно компилятор от IBM на это и намекает.
По крайней мере, IDEA в вышеприведенном примере не генерит никаких ошибок или предупреждений.



P.S. Кстати, для генерации своего SUID разумно использовать serialver.exe все же от SUN – будет больше совместимости при разработке на разных IDE.


PM MAIL   Вверх
simanyay
Дата 5.7.2005, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


Профиль
Группа: Участник
Сообщений: 2053
Регистрация: 22.8.2002

Репутация: 3
Всего: 36



Цитата(carper @ 5.7.2005, 18:29)

Что касается serialVersionUID все верно, но только, насколько я помню, эта переменная не только НЕ ОБЯЗАТЕЛЬНА, но, в общем случае, НЕ ЖЕЛАТЕЛЬНА с точки зрения гибкости и устранения возможных ошибок при изменении класса.


Я не думаю, что разработчики Eclipse принуждали бы использовать нежелательные переменные.


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
carper
Дата 5.7.2005, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 1
Всего: 8



simanyay
" не думаю, что разработчики Eclipse принуждали бы использовать нежелательные переменные. "

А они здесь не совсем "нежеланные", я не уверен в том, что правильно нашел причину этого явления, но полагаю, что виртуальная машина от IBM может использовать иную методику рассчета SUID, соот-но и приходится заботиться от совместимости со стандартной машиной от SUN.

Хотя меня гложут смутные подозрения, что я горожу какую-то ересь. smile
По крайней мере, методика подсчета от SUN весьма прозрачна и логична.

Может здесь дело в том, что "хорошим тоном" для исключений де-факто приняли использовать статический номер, после чего Eclipse решил это правило довести "до уровня генерации предупреждения" smile
PM MAIL   Вверх
simanyay
Дата 5.7.2005, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


Профиль
Группа: Участник
Сообщений: 2053
Регистрация: 22.8.2002

Репутация: 3
Всего: 36



Цитата(carper @ 5.7.2005, 19:44)

Может здесь дело в том, что "хорошим тоном" для исключений де-факто приняли использовать статический номер, после чего Eclipse решил это правило довести "до уровня генерации предупреждения" smile


Вот этот вариант мне больше всех импонирует smile


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
Domestic Cat
Дата 5.7.2005, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 50
Всего: 172



Цитата(carper @ 5.7.2005, 07:29)
НЕ ЖЕЛАТЕЛЬНА с точки зрения гибкости и устранения возможных ошибок при изменении класса.

Не понял. Он используется тогда когда нужно обеспечить совместимость с предыдущими версиями, как он может повлиять на устранение ошибок?


--------------------

PM   Вверх
carper
Дата 6.7.2005, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 2.3.2005

Репутация: 1
Всего: 8



Domestic Cat
"Он используется тогда когда нужно обеспечить совместимость с предыдущими версиями, как он может повлиять на устранение ошибок? "

Боюсь, что это я невнятно выразился. Я имел в виду, ошибку программиста, заключающуюся в том, что он забыл сменить номер, обновив класс так, что это влияет на механизм сериализации.
Соответственно, вместо того, чтобы схлопотать ошибку внешне все выглядит пристойно, только вот программа вдруг начинает себя вести как-то странно.

Да и вообще, более логичным выглядело бы задание номера на классе реализущим не Serializable а Externalizable, по крайней мере, он жестче определяет поведение программиста в части самостоятельного использования readExternal и writeExternal (будете ли вы переопределять readObject и writeObject еще бабушка надвое сказала) , т.е. сложней будет забыть изменить номер.


И все же меня заинтриговало решение самой SUN о явном задании номера классов- исключений.
После отпуска попробую покопать, если чего найду с удовольствием сообщу.





PM MAIL   Вверх
inxaoc
Дата 27.10.2006, 14:46 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.6.2006

Репутация: нет
Всего: нет



Подскажите пожалуйста как генерить этот ID в Intellij Idea
PM MAIL   Вверх
Shurr
Дата 27.10.2006, 17:51 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 24.10.2006

Репутация: 5
Всего: 7



Цитата(inxaoc @ 27.10.2006,  14:46)
Подскажите пожалуйста как генерить этот ID в Intellij Idea

Есть специальный плагин GenerateSerialVersionUID. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.