Serialization
e
SerialVersionUID
sempre permanece um mistério para muitos desenvolvedores Java. Muitas vezes vejo perguntas sobre o que é
SerialVersionUID
ou o que acontece se eu não declarar
SerialVersionUID
na minha
Serializable
classe?
Além de ser confuso e pouco usado, outro motivo para esta pergunta é o aviso ausente do Eclipse IDE
SerialVersionUID
, por exemplo: "
A classe Serializable Customer não declara um campo SerialVersionUID final estáticoSerializable
do
Customer
tipo
SerialVersionUID
long " Neste artigo, você aprenderá não apenas o básico de Java
SerialVersionUID
, mas também seu impacto no processo de serialização e desserialização. Quando você declara uma classe, por exemplo,
Serializable
implementando uma interface de token
java.io.Serializable
, o tempo de execução Java armazena uma instância dessa classe no disco usando o mecanismo de serialização padrão, a menos que você configure o processo para usar
a interface externalizável . Durante a serialização, o tempo de execução Java cria um número de versão para a classe para que possa desserializá-la posteriormente. Em Java, esse número de versão é conhecido como
SerialVersionUID
. Se, durante a desserialização,
SerialVersionUID
não houver correspondência, então o processo sairá com uma exceção
InvalidClassException
no "
main
" stream
java.io.InvalidClassException
e também imprimirá o nome da classe e o arquivo
SerialVersionUID
. Uma solução rápida para corrigir esse problema é copiá-lo
SerialVersionUID
e defini-lo como uma constante de tipo
private
static
final
long
em sua classe. Neste artigo, aprenderemos por que devemos usar
SerialVersionUID
em Java e como usar a ferramenta serialver JDK para gerar esse ID. Se você é novo na serialização, também pode assistir às
10 principais perguntas da entrevista sobre serialização Java para avaliar seu conhecimento e encontrar lacunas em seu entendimento para leitura adicional. Assim como
Concurrency
(simultaneidade) e
Multi-threading
(multithreading),
Serialization
(serialização) é outro tópico que merece ser lido diversas vezes.
Por que usar SerialVersionUID em Java
Como eu disse, quando não definimos um valor
SerialVersionUID
como
static
final
long
em nossa classe, o mecanismo de serialização fará isso por nós. Este mecanismo é sensível a muitos detalhes, incluindo os campos da sua classe, seus modificadores de acesso, as interfaces que ele implementa e até mesmo diferentes implementações de compilador; quaisquer alterações na classe ou uso de um compilador diferente podem produzir um resultado diferente, o
SerialVersionUID
que acabará por impedir que os dados serializados sejam recarregados. É arriscado confiar no mecanismo de serialização do Java para gerar esse ID, e é por isso que é uma boa ideia defini-lo explicitamente
SerialVersionUID
em sua
classe Serializable . Eu recomendo fortemente a leitura do clássico Java -
Joshua Bloch “Effective Java” para entender a serialização Java e os problemas de manuseá-la incorretamente. A propósito, o JDK também fornece uma ferramenta
serialver
, localizada no diretório
bin do diretório
JAVA_HOME , no meu computador,
C:\Program Files\Java\jdk1.6.0_26\bin\serialver.exe , que pode ser usada para gerar
SerialVersionUID
para aulas antigas. Isso é muito útil caso você tenha feito alterações em sua classe que interrompam a serialização e seu aplicativo não consiga recarregar instâncias serializadas. Você pode facilmente usar este utilitário para criar
SerialVersionUID
instâncias antigas e, em seguida, usá-lo explicitamente declarando o campo como
private static final long SerialVersionUID
. A propósito, é altamente recomendado por razões de desempenho e segurança usar o formato binário regular para serialização; novamente, “Java Eficaz” tem vários parágrafos que demonstram as vantagens do formato regular em grande detalhe.
Como usar o utilitário serialver JDK para gerar SerialVersionUID
Você pode usar
serialver
para gerar
SerialVersionUID
para aulas. Isto é especialmente útil para o desenvolvimento de classes; o utilitário retorna
SerialVersionUID
em um formato fácil de copiar. Você pode usar o
serialver
utilitário JDK conforme mostrado no exemplo:
$ serialver
use: serialver [-classpath classpath] [-show] [classname...]
$ serialver -classpath . Hello
Class Hello is not Serializable.
$ serialver -classpath . Hello
Hello: static final long SerialVersionUID = -4862926644813433707L;
Você também pode usar o utilitário
serialver
como
GUI
um comando
$ serialver –show
, isso abrirá um inspetor
serial version
que pega o nome completo da classe e o exibe
Serial version
.
Resumo
Agora que sabemos o que é
SerialVersionUID
e por que é importante declará-lo em uma
Serializable
classe -, é hora de revisar alguns fatos importantes relacionados ao Java SerialVersionUID.
SerialVersionUID
usado para indicar a versão dos dados serializados.
- Quando não declaramos
SerialVersionUID
em nossa classe, o tempo de execução Java faz isso por nós, mas esse processo é sensível a muitos metadados da classe, incluindo o número de campos, tipo de campos, modificadores de acesso de campo, interfaces que são implementadas na classe , etc. Você pode encontrar as informações exatas na documentação de serialização da Oracle.
- Recomenda-se declarar SerialVersionUID como uma variável longa final estática privada para evitar o mecanismo padrão. Alguns IDEs, como o Eclipse , também emitem avisos caso você esqueça isso, por exemplo: "A classe Serializable Customer não declara um campo SerialVersionUID final estático do tipo long." . Embora você possa desativar esse aviso acessando Janela > Preferências > Java > Compilador > Erros/Avisos > Problemas potenciais de programação, sugiro não fazer isso. Somente quando a recuperação de dados não é necessária posso ser descuidado. Esta é a aparência desse erro no Eclipse IDE, tudo que você precisa fazer é tomar a primeira decisão rápida.
- Você também pode usar o utilitário serialver do JDK para gerar versão serial para classes em Java. O utilitário também possui uma GUI, que é habilitada ao passar o parâmetro -
show
.
- A prática recomendada na serialização é declarar explicitamente
SerialVersionUID
, para evitar problemas com a desserialização, especialmente se você estiver trabalhando com um aplicativo cliente-servidor que depende de dados serializados, como o RMI.
É tudo uma questão
SerialVersionUID
de Java. Agora sabemos porque é importante declarar corretamente
SerialVersionUID
na aula. Você pode agradecer ao seu IDE por este lembrete, que pode interromper a desserialização da sua classe. Se quiser ler mais sobre serialização e conceitos relacionados, você também pode conferir estes artigos incríveis.
Original
aqui
GO TO FULL VERSION