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

StackOverflow https://stackoverflow.com/questions/2288937

Вопрос

На этот вопрос уже есть ответ здесь:

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

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();
                }
            });
        }

}
Это было полезно?

Решение

Из Javadoc:

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

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

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

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

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

Другие советы

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

public class HelloWorldSwing extends JFrame {

        JTextArea m_resultArea = new JTextArea(6, 30);
        private static final long serialVersionUID = 1L;

Другие ответы на данный момент содержат много технической информации.Постараюсь ответить, как просили, простыми словами.

Сериализация — это то, что вы делаете с экземпляром объекта, если хотите записать его в необработанный буфер, сохранить на диск, передать в двоичном потоке (например, отправить объект через сетевой сокет) или иным образом создать сериализованный объект. двоичное представление объекта.(Дополнительную информацию о сериализации см. Сериализация Java в Википедии).

Если вы не собираетесь сериализовать свой класс, вы можете добавить аннотацию прямо над своим классом. @SuppressWarnings("serial").

Если вы собираетесь сериализовать, вам придется беспокоиться о множестве вещей, связанных с правильным использованием UUID.По сути, UUID — это способ «версии» объекта, который вы хотите сериализовать, чтобы любой десериализуемый процесс знал, что он десериализуется правильно.я бы посмотрел на Обеспечьте надлежащий контроль версий для сериализованных объектов. Чтобы получить больше информации.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top