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


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

  • Что такое serialVersionUID и почему я должен его использовать? 21 ответов

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

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

}
5 189

5 ответов:

С документация:

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

вы можете настроить IDE на:

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

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

нет, этого не может быть. Это может вызвать проблему, только если вы сериализуете объекты и десериализуете их в другом месте( или времени), где (когда) класс изменился, и это не приведет к замораживанию, но в 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 и он должен быть изменен всякий раз, когда что-либо изменяется, что влияет на сериализацию (дополнительные поля, удаленные поля, изменение порядка полей,...). Значение поля проверяется во время десериализации, и если значение сериализованного объекта не равно значению класса в текущей виртуальной машине, создается исключение.

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