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

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

PS Я знаю, что такое ООП. Я знаю, что такое объект, class, метод, поле и экземпляр.

PPS Если кому-то нужен мой код, он находится здесь:

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 :

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

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

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

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

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

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

     public class HelloWorldSwing extends JFrame { JTextArea m_resultArea = new JTextArea(6, 30); private static final long serialVersionUID = 1L; 

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

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

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

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

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

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

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

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

    Давайте будем гением компьютера.