Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > serialVersionUID


Автор: devmstr 12.4.2007, 07:55
Есть код вида:
Код

private class myAction extends AbstractAction

И на него компилер выдает warning:
Код

The serializable class myAction does not declare a static final serialVersionUID field of type long

Что это за поле?

Автор: powerOn 12.4.2007, 08:37
http://forum.java.sun.com/thread.jspa?threadID=515351&messageID=2454326 почитай.

Автор: devmstr 12.4.2007, 10:49
powerOn, 
Спасибо за статью!

Тоесть можно добавить в текст класса:
Код

private static final long serialVersionUID = 3487495895819393L;

И все будет правильно?

Автор: LSD 12.4.2007, 11:25
Предупреждения не будет.

Автор: devmstr 12.4.2007, 11:28
Не это я то понял, ну а логически это будет правильно?

Автор: LSD 12.4.2007, 11:43
Поле serialVersionUID нужно для того, чтобы в случае изменения твоих классов, не было проблем с десериализацие объектов.

Пример у тебя есть класс:
Код
public class A implements Serializable
{
  public String a;
}

ты его скомпилировал в клиентское и серверное приложения.

Теперь тебе понадобилось там еще одно поле, и ты изменил класс (изменил только на сервере, клиента не трогал):
Код
public class A implements Serializable
{
  public String a;
  public int i;
}

теперь клиент и сервер, не смогут обмениваться данными, т.к. будет ошибка десериализации объекта. У них не будет совпадать serialVersionUID (он динамически вычисляется для класса, по тому какие поля он объявляет).

Чтобы исправить ситуацию, можно сделать так:
Код
public class A implements Serializable
{
  private static final long serialVersionUID = 3487495895819393L;

  public String a;
  public transient int i;
}

где значением serialVersionUID должно быть, то значение которое выдаст утилита serialver для старой версии класса. Тогда десериализация снова заработает, но поле i передаваться не будет.

При желании можно написать свою логику восстановления класса из потока, как это сделать описано в JavaDoc-е по классу Serializable.

Автор: devmstr 12.4.2007, 12:02
LSD, 
Спасобо! Теперь все понял!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)