¿Qué significa: La clase serializable no declara un campo serialVersionUID static final? [duplicar]

StackOverflow https://stackoverflow.com/questions/2288937

Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

Tengo el mensaje de advertencia que figura en el título. Me gustaría entender y retirarla. He encontrado ya algunas respuestas en esta pregunta, pero no entiendo estas respuestas debido a una sobrecarga con los términos técnicos. ¿Es posible explicar este tema con palabras sencillas?

P.S. Yo sé lo que es programación orientada a objetos. Yo sé lo que es objeto, clase, método, de campo y de instancias.

P.P.S. Si alguien necesita mi código es 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();
                }
            });
        }

}
¿Fue útil?

Solución

Desde el javadoc :

  

Los asociados de serialización de tiempo de ejecución con cada clase serializable un número de versión, llamada serialVersionUID, que se utiliza durante la deserialización para verificar que el emisor y el receptor de un objeto serializado han cargado clases para el objeto que son compatibles con respecto a la serialización. Si el receptor se ha cargado una clase para el objeto que tiene un serialVersionUID diferente que la de la clase del remitente correspondiente, a continuación, deserialización resultará en un InvalidClassException. Una clase serializable puede declarar su propia serialVersionUID explícitamente declarando un "serialVersionUID" llamado campo que debe ser estática, final y de tipo long:

Puede configurar el IDE a:

  • ignorar esto, en lugar de dar una advertencia.
  • autogenerar un id

Según su pregunta adicional "¿Es posible que el mensaje de advertencia discutido es una razón por la que mi aplicación GUI congelar?":

No, no puede ser. Puede causar un problema sólo si está seria objetos y deserializar en un lugar diferente (o tiempo) en que (cuando) la clase ha cambiado, y no va a causar un congelamiento, pero en InvalidClassException.

Otros consejos

Las razones de la advertencia se documentan aquí , y las correcciones son simples para desactivar la advertencia o ponga la siguiente declaración en el código para suministrar el UID versión. El valor real no es relevante, comenzar con 999, si se quiere, pero se cambia cuando se realizan cambios incompatibles a la clase es.

public class HelloWorldSwing extends JFrame {

        JTextArea m_resultArea = new JTextArea(6, 30);
        private static final long serialVersionUID = 1L;

Las otras respuestas hasta el momento tienen una gran cantidad de información técnica. Voy a tratar de responder, conforme a lo solicitado, en términos simples.

La serialización es lo que hace a una instancia de un objeto si desea volcar a un tampón en bruto, guardarlo en el disco, lo transportan en una corriente binaria (por ejemplo, el envío de un objeto a través de una toma de red), o de otra manera crear una representación binaria de un objeto serializado. (Para obtener más información sobre la serialización ver serialización Java en Wikipedia ).

Si usted no tiene intención de serialización de la clase, se puede añadir la anotación justo por encima de su @SuppressWarnings("serial") clase.

Si va a serializar, entonces usted tiene una gran cantidad de cosas que preocuparse de todos y centrado en el uso adecuado de UUID. Básicamente, el UUID es una forma de "versión" un objeto que podría serializar modo que cualquier proceso que es des-serialización sabe que es des-serializar correctamente. Me gustaría ver Asegurar el control de la versión adecuada para objetos serializados para obtener más información.

  

debe ser cambiado cada vez que algo   cambios que afectan a la serialización   (campos adicionales, campos retirados,   cambio de orden de los campos, ...)

Eso no es correcto, y usted no será capaz de citar una fuente authoriitative para esa reclamación. Se debe cambiarse cada vez que hagas un cambio que es incompatible con arreglo a las reglas establecidas en la Control de versiones de objetos serializables sección de la serialización de objetos Especificación , lo que hace específicamente no incluyen campos o cambio de orden de los campos adicionales, y cuando no se ha proporcionado readObject(), writeObject(), y / o readResolve() o /writeReplace() métodos y / o una declaración serializableFields que podría hacer frente al cambio.

Cualquier clase que puede ser serializado (es decir implementos Serializable) debería declarar que UID y debe ser cambiado siempre que cambia todo lo que afecta la serialización (campos adicionales, campos retirados, cambio de orden de los campos, ...). el valor del campo se comprueba durante la deserialización y si el valor del objeto serializado no es igual al valor de la clase en el VM actual, se inicia una excepción.

Tenga en cuenta que este valor es especial en que se serializa con el objeto a pesar de que es estático, por las razones descritas anteriormente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top