Что означает: сериализуемый класс не объявляет статический финал serialVersionUID поле? [дубликат]

Этот вопрос уже имеет ответ здесь:

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

P.S. Я знаю, каково ООП. Я знаю то, что является объектом, классом, методом, полем и инстанцированием.

P.P.S. Если кому-то нужен мой код, это здесь:

import java.awt.*;
import javax.swing.*;


public class HelloWorldSwing extends JFrame {

        JTextArea m_resultArea = new JTextArea(6, 30);

        //====================================================== constructor
        public HelloWorldSwing() {
            //... Set initial text, scrolling, and border.
            m_resultArea.setText("Enter more text to see scrollbars");
            JScrollPane scrollingArea = new JScrollPane(m_resultArea);
            scrollingArea.setBorder(BorderFactory.createEmptyBorder(10,5,10,5));

            // Get the content pane, set layout, add to center
            Container content = this.getContentPane();
            content.setLayout(new BorderLayout());
            content.add(scrollingArea, BorderLayout.CENTER);
            this.pack();
        }

        public static void createAndViewJFrame() {
            JFrame win = new HelloWorldSwing();
            win.setTitle("TextAreaDemo");
            win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            win.setVisible(true);
        }

        //============================================================= main
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable(){
                public void run(){
                    createAndViewJFrame();
                }
            });
        }

}
208
задан Roman 18 February 2010 в 03:40
поделиться

4 ответа

Из javadoc :

Среда выполнения сериализации связывает с каждым сериализуемым классом номер версии, называемый serialVersionUID , который используется во время десериализации для проверки того, что отправитель и получатель сериализованного объекта загрузили классы для этого объекта, которые совместимы с сериализацией. .Если получатель загрузил класс для объекта, который имеет другой serialVersionUID , чем у соответствующего класса отправителя, то десериализация приведет к исключению InvalidClassException . Сериализуемый класс может явно объявить свой собственный serialVersionUID , объявив поле с именем «serialVersionUID» , которое должно быть статическим, окончательным и иметь тип long:

Вы можете настроить свою среду IDE на :

  • игнорируйте это вместо предупреждения.
  • автоматически сгенерировать идентификатор

В соответствии с вашим дополнительным вопросом «Может быть, обсуждаемое предупреждающее сообщение является причиной зависания моего приложения с графическим интерфейсом пользователя?»:

Нет, не может быть. Это может вызвать проблему только в том случае, если вы сериализуете объекты и десериализуете их в другом месте (или времени), где (когда) класс изменился, и это не приведет к зависанию, но в InvalidClassException .

151
ответ дан 23 November 2019 в 04:42
поделиться

Причины предупреждения описаны здесь , а простые исправления состоят в том, чтобы отключить предупреждение или добавить следующее объявление в код предоставить UID версии. Фактическое значение не имеет значения, начните с 999, если хотите, но изменить его, когда вы вносите несовместимые изменения в класс.

public class HelloWorldSwing extends JFrame {

        JTextArea m_resultArea = new JTextArea(6, 30);
        private static final long serialVersionUID = 1L;
33
ответ дан 23 November 2019 в 04:42
поделиться

Из javadoc :

Среда выполнения сериализации связывает с каждым сериализуемым классом номер версии, называемый serureVersionUID , который используется во время десериализации для проверки того, что отправитель и получатель сериализуемого объекта имеют загруженные классы для этого объекта, совместимые с сериализацией. Если получатель загрузил класс для объекта, у которого значение serureVersionUID отличается от значения класса соответствующего отправителя, то десериализация приведет к InvalidClassException . Сериализуемый класс может объявить собственный serureVersionUID явным образом, объявив поле с именем "serureVersionUID" , которое должно быть статическим, окончательным и иметь тип long:

Можно настроить среду IDE так, чтобы

  • игнорировала это, а не выводила предупреждение.
  • Автогенерация идентификатора

Согласно вашему дополнительному вопросу "Может ли быть, что обсуждаемое предупреждающее сообщение является причиной, по которой мое приложение графического интерфейса пользователя замораживается?":

Нет, это не может быть. Это может вызвать проблему только при сериализации объектов и десериализации их в другом месте (или времени), где (когда) класс изменился, и это приведет не к замораживанию, а к InvalidClassException .

-121--613422-

Можно вернуть результат перенаправления:

public ActionResult Thumbnail()
{
    return Redirect("http://domain.com/test.jpg");
}

Если url указывает на файл изображения, то он будет работать. Конечно, не следует предоставлять URL-адрес этого действия пользователю, но использовать его в каком-либо другом представлении как значение атрибута < img > src:

<img src="<%= Url.Action("Thumbnail", "ControllerName") %>" />
-121--4012964-

Любой класс, который может быть сериализован (т.е. реализует Serializable ), должен объявлять, что идентификатор UID должен быть изменен при каждом изменении, влияющем на сериализацию (дополнительный Значение поля проверяется во время десериализации, и если значение сериализованного объекта не равно значению класса в текущей виртуальной машине, возникает исключение.

Обратите внимание, что это значение является особым в том смысле, что оно сериализовано с объектом, даже если оно является статическим, по причинам, описанным выше.

5
ответ дан 23 November 2019 в 04:42
поделиться

его нужно менять всякий раз, когда что-либо изменяется, что влияет на сериализация (дополнительные поля, удаленные поля, изменение порядка полей, ...)

Это неверно, и вы не сможете указать авторитетный источник для этого утверждения. Его следует изменять всякий раз, когда вы вносите изменение, несовместимое с правилами, приведенными в разделе Управление версиями сериализуемых объектов в Спецификации сериализации объектов , в которой конкретно не ] включают дополнительные поля или изменение порядка полей, и , если вы не предоставили readObject (), writeObject (), и / или readResolve () или Методы / writeReplace () и / или объявление serializableFields , которые могут справиться с изменением.

27
ответ дан 23 November 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: