Что это означает: сериализуемый класс не объявляет статическое окончательное поле 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();
                }
            });
        }

}

person Roman    schedule 18.02.2010    source источник
comment
Может быть, обсуждаемое предупреждающее сообщение является причиной зависания моего приложения с графическим интерфейсом пользователя?   -  person Roman    schedule 18.02.2010
comment
нет, ничего общего с зависанием вашего графического интерфейса.   -  person james    schedule 18.02.2010
comment
Дуп: stackoverflow.com/questions/285793/   -  person skaffman    schedule 19.02.2010


Ответы (5)


Из javadoc:

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

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

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

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

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

person Bozho    schedule 18.02.2010
comment
Вы также можете позволить вашей IDE автоматически сгенерировать его. - person BalusC; 18.02.2010
comment
@BalusC - как мы можем это сделать в затмении? Безопасно ли автоматическое создание? - person Jedi Knight; 17.03.2013
comment
@JediKnight В Eclispse это окно ›Настройки› Java ›Стиль кода› Очистить ›Отсутствующий код› активировать Добавить идентификатор серийной версии в разделе Возможные проблемы программирования. Затем, если вы находитесь в профиле по умолчанию, очевидно, вы должны сохранить его как другой. - person 0x41414141; 20.04.2014
comment
Не создавайте автоматически serialVersionUID, если вы не используете сериализацию. Это уже происходит во время компиляции, без необходимости отравлять исходный код глупым случайным числом, чтобы ваша IDE была довольна. Просто отключите предупреждение Eclipse, потому что именно отсюда и возникает путаница. Если вы когда-нибудь захотите использовать сериализацию (в наши дни вероятность этого приближается к 0), прочтите об этом и используйте serialVersionUID в качестве НОМЕРА ВЕРСИИ (начиная с 1 и увеличиваясь при изменении определения вашего класса с помощью специального кода для чтения старые версии). - person john16384; 16.06.2019

В других ответах пока много технической информации. Я постараюсь ответить, как и просили, простым языком.

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

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

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

person MrMas    schedule 26.04.2013
comment
В вашей цитате есть несколько серьезных ошибок, а также некоторые внутренние противоречия. - person user207421; 14.06.2014
comment
@EJP Всем было бы полезно, если бы вы перечислили ошибки. - person MrMas; 18.06.2014
comment
@EJP Мне пришло в голову, что в моем ответе две цитаты. На какую цитату вы ссылаетесь? - person MrMas; 31.05.2016
comment
Я имею в виду статью Javaworld, но единственные цитаты в вашем ответе относятся к сторонним ресурсам, которые не имеют большего значения, чем ответы на этом веб-сайте: часто значительно меньше. Единственные соответствующие ссылки - это нормативные ссылки: JLS, Спецификация JVM, Спецификация Java Object Serializatikn и Javadoc. - person user207421; 22.05.2017

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

public class HelloWorldSwing extends JFrame {

        JTextArea m_resultArea = new JTextArea(6, 30);
        private static final long serialVersionUID = 1L;
person Robin    schedule 18.02.2010
comment
Причины предупреждения задокументированы в Спецификации сериализации объектов Java и Javadoc. Ответы StackOverflow не являются нормативными справочными материалами. - person user207421; 22.05.2017

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

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

person user207421    schedule 18.02.2010

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

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

person Thomas Lötzer    schedule 18.02.2010
comment
Я JFrame сериализуемый класс? Что такое UID и как его объявить? Изменяет ли мой код что-то, что влияет на сериализацию? Что на самом деле означает сериализация? - person Roman; 18.02.2010
comment
Да, JFrame - это java.awt.Component, который реализует Serializable. Код никогда не меняет ничего, что влияет на сериализацию, это делают только программисты. Я не знаю списка, в котором перечислены все изменения, влияющие на сериализацию. См. en.wikipedia.org/wiki/Serialization#Java для описания сериализации в Ява. - person Thomas Lötzer; 18.02.2010
comment
Он не сериализуется с объектом. Его не следует изменять, если вы не хотите нарушить совместимость или если вы уже сделали это, отклонившись от того, что указано в разделе спецификации. Это не включает добавление или изменение порядка полей. Правильная ссылка - это не Википедия, а Спецификация сериализации объектов. - person user207421; 16.05.2011
comment
дополнительные поля, удаленные поля, изменение порядка полей вообще не имеют значения. Только изменение типа имеет значение, если вы не реализуете readObject () для обработки изменения. - person The incredible Jan; 23.04.2020