JavaRush /Blogue Java /Random-PT /Por que usar SerialVersionUID dentro da classe Serializab...
0xFF
Nível 9
Донецк

Por que usar SerialVersionUID dentro da classe Serializable em Java

Publicado no grupo Random-PT
Serializatione SerialVersionUIDsempre permanece um mistério para muitos desenvolvedores Java. Muitas vezes vejo perguntas sobre o que é SerialVersionUIDou o que acontece se eu não declarar SerialVersionUIDna minha Serializableclasse? Por que usar SerialVersionUID dentro da classe Serializable em Java - 1Alé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 Customertipo SerialVersionUIDlong " 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, Serializableimplementando 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, SerialVersionUIDnão houver correspondência, então o processo sairá com uma exceção InvalidClassExceptionno " main" stream java.io.InvalidClassExceptione também imprimirá o nome da classe e o arquivo SerialVersionUID. Uma solução rápida para corrigir esse problema é copiá-lo SerialVersionUIDe defini-lo como uma constante de tipo private static final longem sua classe. Neste artigo, aprenderemos por que devemos usar SerialVersionUIDem 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 SerialVersionUIDcomo static final longem 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 SerialVersionUIDque 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 SerialVersionUIDem 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 SerialVersionUIDpara 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 SerialVersionUIDinstâ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 serialverpara gerar SerialVersionUIDpara aulas. Isto é especialmente útil para o desenvolvimento de classes; o utilitário retorna SerialVersionUIDem um formato fácil de copiar. Você pode usar o serialverutilitá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 serialvercomo GUIum comando $ serialver –show, isso abrirá um inspetor serial versionque pega o nome completo da classe e o exibe Serial version.

Resumo

Agora que sabemos o que é SerialVersionUIDe por que é importante declará-lo em uma Serializableclasse -, é hora de revisar alguns fatos importantes relacionados ao Java SerialVersionUID.
  1. SerialVersionUIDusado para indicar a versão dos dados serializados.

  2. Quando não declaramos SerialVersionUIDem 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.

  3. 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. Por que usar SerialVersionUID dentro da classe Serializable em Java - 2

  4. 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.

  5. 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 SerialVersionUIDde Java. Agora sabemos porque é importante declarar corretamente SerialVersionUIDna 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
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION