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