O que significa:A classe serializável não declarar um static final serialVersionUID campo?[duplicado]

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

Pergunta

Esta pergunta já tem uma resposta aqui:

Eu tenho a mensagem de aviso dado no título.Eu gostaria de entender e removê-lo.Eu encontrei já algumas respostas a esta questão, mas eu não entendo essas respostas devido a uma sobrecarga com termos técnicos.É possível explicar esse problema com simples palavras?

P. S.Eu sei que a OOP é.Eu sei o que é objeto, classe, método, de campo e de instanciação.

P. P. S.Se alguém precisa da minha código aqui:

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();
                }
            });
        }

}
Foi útil?

Solução

Do javadoc:

A serialização de tempo de execução associa a cada classe serializável um número de versão, chamada serialVersionUID, o que é usado durante a desserialização para verificar se o remetente e o receptor de um objeto serializado de ter carregado classes para o objeto que são compatíveis com o respeito à serialização.Se o receptor tem carregado de uma classe para o objeto que tem um diferente serialVersionUID do que o correspondente do remetente classe e, em seguida, a desserialização irá resultar em um InvalidClassException.Uma classe serializável pode declarar o seu próprio serialVersionUID explicitamente, ao declarar um campo chamado "serialVersionUID" que deve ser static, final, e do tipo long:

Você pode configurar o IDE para:

  • ignorar isso, em vez de dar um aviso.
  • autogenerate um id

Como por sua adicionais pergunta: "Pode ser que o discutido mensagem de aviso é uma razão por que minha aplicação GUI congelar?":

Não, ele não pode ser.Ele pode causar um problema somente se você estiver serialização de objetos e desserializar-los em um lugar diferente (ou tempo) em que (quando) a turma mudou, e ele não vai resultar no congelamento, mas em InvalidClassException.

Outras dicas

As razões para aviso estão documentadas aqui, e as correções simples devem desligar o aviso ou colocar a seguinte declaração em seu código para fornecer a versão UID. O valor real não é relevante, comece com 999, se quiser, mas alterando -o quando você faz alterações incompatíveis na classe.

public class HelloWorldSwing extends JFrame {

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

As outras respostas até agora têm muitas informações técnicas. Vou tentar responder, conforme solicitado, em termos simples.

A serialização é o que você faz com uma instância de um objeto, se quiser despejá -lo em um buffer cru, salve -o para disco, transportá -lo em um fluxo binário (por exemplo, enviar um objeto sobre um soquete de rede) ou criar um serializado representação binária de um objeto. (Para mais informações sobre serialização, consulte Serialização de Java na Wikipedia).

Se você não tem intenção de serializar sua classe, poderá adicionar a anotação logo acima da sua classe @SuppressWarnings("serial").

Se você vai serializar, terá uma série de coisas com que se preocupe com o uso adequado do UUID. Basicamente, o UUID é uma maneira de "versão" de um objeto que você serializaria para que qualquer processo seja desperdício saiba que está despertador adequadamente. Eu olha para Garanta o controle adequado da versão para objetos serializados Para maiores informações.

Ele deve ser alterado sempre que algo mudar que afeta a serialização (campos adicionais, campos removidos, mudança de ordem de campo, ...)

Isso não está correto, e você não poderá citar uma fonte autorizada para essa reivindicação. Deve ser alterado sempre que você fizer uma alteração incompatível sob as regras dadas no Versão de objetos serializáveis Seção do Especificação de serialização do objeto, que especificamente faz não Inclua campos adicionais ou mudança de ordem de campo, e Quando você não forneceu readObject(), writeObject(), e/ou readResolve() ou /writeReplace() métodos e/ou um serializableFields Declaração que poderia lidar com a mudança.

Qualquer classe que possa ser serializada (ou seja, implementos Serializable) deve declarar que o UID e deve ser alterado sempre que algo mudar que afeta a serialização (campos adicionais, campos removidos, mudança de ordem de campo, ...). O valor do campo é verificado durante a desserialização e se o valor do objeto serializado não for igual ao valor da classe na VM atual, uma exceção será lançada.

Observe que esse valor é especial, pois é serializado com o objeto, mesmo que seja estático, pelos motivos descritos acima.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top