java - valor - ¿Qué significa: la clase serializable no declara un campo final serialVersionUID estático?
serialversionuid generator (5)
debe cambiarse cada vez que cambie algo que afecte a la serialización (campos adicionales, campos eliminados, cambio de orden de campo, ...)
Eso no es correcto, y no podrá citar una fuente autorizada para esa reclamación. Debe cambiarse cada vez que realice un cambio que sea incompatible con las reglas indicadas en la sección Control de versiones de objetos serializables de la Especificación de serialización de objetos , que específicamente no incluye campos adicionales o cambios en el orden de los campos, y cuando no haya proporcionado readObject(), writeObject(),
y / o readResolve()
o /writeReplace()
y / o una declaración serializableFields
que podría hacer frente al cambio.
Esta pregunta ya tiene una respuesta aquí:
- ¿Qué es un serialVersionUID y por qué debería usarlo? 21 respuestas
Tengo el mensaje de advertencia dado en el título. Me gustaría entenderlo y eliminarlo. Ya encontré algunas respuestas a esta pregunta, pero no entiendo estas respuestas debido a una sobrecarga de términos técnicos. ¿Es posible explicar este problema con palabras simples?
PD Sé lo que es OOP. Sé lo que es objeto, clase, método, campo e instanciación.
PPS Si alguien necesita mi código está aquí:
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();
}
});
}
}
Cualquier clase que pueda ser serializada (es decir, implementa Serializable
) debe declarar que UID y debe cambiarse cada vez que cambie algo que afecte la serialización (campos adicionales, campos eliminados, cambio de orden de campo, ...). El valor del campo se verifica durante la deserialización y si el valor del objeto serializado no es igual al valor de la clase en la máquina virtual actual, se lanza una excepción.
Tenga en cuenta que este valor es especial, ya que se serializa con el objeto aunque sea estático, por los motivos descritos anteriormente.
Desde el javadoc :
El tiempo de ejecución de serialización asocia con cada clase serializable un número de versión, llamado
serialVersionUID
, que se usa durante la deserialización para verificar que el remitente y el receptor de un objeto serializado hayan cargado clases para ese objeto que sean compatibles con respecto a la serialización. Si el receptor ha cargado una clase para el objeto que tiene unserialVersionUID
diferente al de la clase del remitente correspondiente, la deserialización dará como resultado unaInvalidClassException
. Una clase serializable puede declarar su propioserialVersionUID
declarando explícitamente un campo llamado"serialVersionUID"
que debe ser estático, final y de tipo long:
Puede configurar su IDE para:
- Ignora esto, en lugar de dar una advertencia.
- autogenerar una identificación
Según su pregunta adicional "¿Puede ser que el mensaje de advertencia analizado sea una razón por la que mi aplicación GUI se congele?":
No, no puede ser. Puede causar un problema solo si está serializando objetos y deserializándolos en un lugar (o hora) diferente donde (cuando) la clase ha cambiado, y no se congelará, sino en InvalidClassException
.
Las otras respuestas hasta ahora tienen mucha información técnica. Intentaré responder, según lo solicitado, en términos simples.
La serialización es lo que hace a una instancia de un objeto si desea volcarlo en un búfer en bruto, guardarlo en un disco, transportarlo en una secuencia binaria (por ejemplo, enviar un objeto a través de un socket de red), o crear un serializado. Representación binaria de un objeto. (Para obtener más información sobre la serialización, consulte Java Serialización en Wikipedia ).
Si no tiene intención de serializar su clase, puede agregar la anotación justo encima de su clase @SuppressWarnings("serial")
.
Si va a serializar, entonces tiene muchas cosas de las que preocuparse, todo centrado en el uso correcto de UUID. Básicamente, el UUID es una forma de "versionar" un objeto que se serializaría para que cualquier proceso de deserialización sepa que se está serializando correctamente. Me gustaría consultar Asegurar el control de versión adecuado para los objetos serializados para obtener más información.
Las razones de la advertencia se documentan here , y las soluciones simples son desactivar la advertencia o colocar la siguiente declaración en su código para proporcionar la versión UID. El valor real no es relevante, comience con 999 si lo desea, pero cambiarlo cuando realice cambios incompatibles en la clase sí lo es.
public class HelloWorldSwing extends JFrame {
JTextArea m_resultArea = new JTextArea(6, 30);
private static final long serialVersionUID = 1L;