IntelliJ IDEA gerando serialVersionUID


297

Como gerar esse valor no IntelliJ IDEA?

Eu vou para Configurações -> Erros -> Problemas de serialização -> Classe serializável sem 'serialVersionUID', mas ainda não me mostra o aviso. Minha classe pai PKladrBuilding implementa a interface Serializable .

Parte do código:

public class PKladrBuilding extends PRQObject

public abstract class PRQObject extends PObject

public abstract class PObject implements Serializable

3
Tem certeza de que precisa gerar um valor, em vez de definir o seu próprio? Se você estiver criando uma nova classe, recomendo que você defina, por exemplo, 1Lcomo seu ID e incremente quando o formulário serializado for alterado. (Consulte stackoverflow.com/questions/888335/… ).
Duncan Jones

1

Respostas:


588

Não tenho certeza se você tem uma versão antiga do IntelliJ IDEA, mas se eu for para o menu ArquivoConfigurações ...InspeçõesProblemas de serialização → Classe serializável sem 'serialVersionUID' habilitado, a classe que você fornecer me fornecerá avisos.

Digite a descrição da imagem aqui

Se eu tentar a primeira aula, vejo:

Digite a descrição da imagem aqui

BTW: Ele não me mostrou um aviso até que eu adicionei { }ao final de cada classe para corrigir o erro de compilação.


2
Tente File| Invalidate Caches, se isso não ajudar, entre em contato com support@jetbrains.com com um projeto de amostra para reproduzir.
12133 CrazyCoder

1
Verifique idea.log(Ajuda | Revelar o login ...) para obter exceções. O diretório inicial criptografado no Linux é conhecido por causar problemas devido ao bug do kernel .
12133 CrazyCoder

1
Eu tenho muitas exceções lá .. como java.lang.NoClassDefFoundError: org / intellij / lang / anototations / MagicConstant;
22412 Kirill Bazarov

2
Reinstalei o IDEA, removi os plug-ins e isso me ajuda. Tnx muito.
22412 Kirill Bazarov

5
O jeito que eu consegui trabalhar na v15 é passar o mouse sobre o ClassName para ver o aviso e mover o mouse lentamente em direção à sarjeta. Nesse ponto, a "lâmpada" aparece na tela. (Tente isso algumas vezes se não funcionar como pretendido na primeira vez). Depois, você pode clicar na opção criar campo para criar o uid. Espero que isso ajude as pessoas que estão presas a isso.
Niyaz

173

Instale o plug-in GenerateSerialVersionUID de Olivier Descout.

Vá para: menu ArquivoConfiguraçõesPluginsProcurar repositóriosGenerateSerialVersionUID

Instale o plug-in e reinicie.

Agora você pode gerar o ID no menu CódigoGerar → serialVersionUID` ou no atalho.


14
Deve-se exigir realmente um plug-in externo para que isso funcione?
H.Rabiee 30/05

Sim, você precisa de um plug-in que já faz parte do repositório de plug-ins do IntelliJ.
Sileria 13/06

Trabalhou para mim no Intellij IDEA 12.1
Sagar Hatekar

Funciona para mim no 13.0.2.
user1978019

Funciona no Android Studio 0.8.9
Itai Hanski 5/09

67

Sem plugins: você só precisa ativar o destaque no IntelliJ:

IntelliJ Preferences -> Editor -> Inspections -> Java -> Serialization issues -> Serializable class without 'serialVersionUID'- defina o sinalizador e clique 'OK'.

Agora, se sua classe implementar Serializable, você verá o destaque e o alt+Enternome da classe proporá gerar private static final long serialVersionUID.

PS: Retirado daqui


4
Obrigado. Não sei por que não vejo a lâmpada, mas clicar no nome da turma e digitar Alt-Enter faz o truque.
John S

2
A resposta é roubada daqui
Serhii Maksymchuk 21/02/19

isso é mais atualizado
Christian Matthew

39

Depois de passar algum tempo em serialização, acho que não devemos gerar serialVersionUIDcom algum valor aleatório, devemos dar um valor significativo.

Aqui está um comentário detalhado sobre isso. Estou lidando com o comentário aqui.

Na verdade, você não deve estar "gerando" UIDs da versão serial. É um "recurso" idiota que decorre do mal-entendido geral de como esse ID é usado pelo Java. Você deve fornecer a esses IDs valores significativos e legíveis, por exemplo, começando com 1L e incrementando-os sempre que achar que a nova versão da classe deve tornar obsoletas todas as versões anteriores (que podem ser serializadas anteriormente). Todos os utilitários que geram esses IDs basicamente fazem o que a JVM faz quando o ID não é definido: eles geram o valor com base no conteúdo do arquivo de classe, criando, assim, números inteiros longos sem significado ilegíveis. Se você deseja que cada versão de sua classe seja distinta (aos olhos da JVM), não deve nem especificar o valor serialVersionUID, pois a JVM produzirá uma em tempo real, e o valor de cada versão da sua classe será único. O objetivo de definir esse valor explicitamente é dizer ao mecanismo de serialização para tratar diferentes versões da classe que possuem o mesmo SVUID como se fossem iguais, por exemplo, para não rejeitar as versões serializadas mais antigas. Portanto, se você definir o ID e nunca alterá-lo (e presumo que seja isso que você faz desde que confia na geração automática e provavelmente nunca gera novamente seus IDs), garante que todas as versões - mesmo absolutamente diferentes - de sua classe será considerada a mesma pelo mecanismo de serialização. É isso que você quer? Caso contrário, e se você realmente deseja ter controle sobre como seus objetos são reconhecidos, deve usar valores simples que você mesmo possa entender e atualizar facilmente quando decidir que a classe mudou significativamente.

Espero que isto ajude. Boa sorte.


2
Obrigado, eu estava pulando esse fato simples por tanto tempo!
dedek

1
Na verdade, eu iria gerar novamente o serialVersionUIDcom um novo número aleatório quando não quiser oferecer suporte a versões antigas na desserialização. Talvez eu não precise usar números aleatórios, mas possa começar com 1 e aumentá-lo. No entanto, 3Lnão tem mais significado para mim então -3518231192373568183L. Portanto, acho que ambas as soluções funcionam da mesma forma. O número aleatório pode ter a vantagem de trabalhar em histórias não lineares com garfos e ramificações.
JojOatXGME

16

Para gerar o valor use

private static final long serialVersionUID = $randomLong$L;
$END$

e forneça à variável de modelo randomLong o seguinte valor: groovyScript ("new Random (). nextLong (). abs ()")

https://pharsfalvi.wordpress.com/2015/03/18/adding-serialversionuid-in-idea/


1
adoro esse comentário, usar modelos ao vivo é a solução mais rápida e personalizável (removi a nova linha, por exemplo). Para configurar ir para Android contexto> Preferências> Editor> Vivo Modelos e criar um novo lá (além de ícone) com este valor e uso editar variáveis para entrar no roteiro
hcpl

13

Além disso, você pode adicionar um modelo ao vivo que fará o trabalho.

Para isso, pressione Ctrl+Alt+S-> "Live Templates"seção -> other(ou w / e você deseja)

E, em seguida, crie um novo com uma definição como esta:

private static final long serialVersionUID = 1L;
$END$

Em seguida, selecione o definitionescopo e salve-o como'serial'

Agora você pode digitar o serialTABcorpo da classe.


3

Outra maneira de gerar o serialVersionUID é usar >Analyze >Run Inspection by Nameno menu de contexto (ou o atalho do teclado, que é ctrl+ alt+ shift+ ipor padrão) e digite "Classe serializável sem 'serialVersionUID'" (ou simplesmente digite "serialVersionUID" e o tipo à frente) A função encontrará para você.

Idéia> Analisar> Executar inspeção por nome Você receberá um menu de contexto onde poderá escolher onde executar as inspeções (por exemplo, tudo de um módulo específico, projeto inteiro, um arquivo, ...)

Com essa abordagem, você nem precisa definir as regras gerais de inspeção para nada.


Bom, isso fez o trabalho para mim. Encontrou a variável que faltava e apresentou a opção de adicioná-la.
arenaq

@arenaq contente, este alguém ajudou outra pessoa ;-)
Alexander

2

Com versão v2018.2.1

Vamos para

Preferências> Editor> Inspeções> Java> Problemas de serialização> alterne "Classe serializável sem 'serialVersionUID'".

Um aviso deve aparecer próximo à declaração da classe.


1

Estou usando o Android Studio 2.1 e tenho uma consistência melhor de obter a lâmpada clicando no nome da classe e passando o mouse por um segundo.


1

Adicione um modelo ativo chamado "ser" ao outro grupo, defina-o como "Aplicável em Java: declaração" e desmarque a opção "Encurtar nomes de FQ". Dê a ele um texto de modelo apenas:

$serial$

Agora edite variáveis ​​e configure serial para:

groovyScript("(System.env.JDK_HOME+'/bin/serialver -classpath '+com.intellij.openapi.fileEditor.FileDocumentManager.instance.getFile(_editor.document).path.replaceAll('/java/.*','').replaceAll('/src/','/build/classes/')+' '+_1).execute().text.replaceAll('.*: *','')",qualifiedClassName())

Ele assume o layout padrão do projeto Gradle. Altere / construa / para / target / para Maven.


1

Método moderno mais fácil: Alt+ Enteron

private static final long serialVersionUID = ;

O IntelliJ sublinha o espaço após o =. coloque o cursor sobre ele e pressione alt+ Enter( Option+ Enterno Mac). Você receberá uma popover que diz "Alterar aleatoriamente o inicializador serialVersionUID". Basta pressionar enter e ele preencherá esse espaço com um comprimento aleatório.


0

Se você deseja adicionar o serialVersionUID ausente para vários arquivos, o IntelliJ IDEA pode não funcionar muito bem. Crio um script simples para cumprir esse objetivo com facilidade:

base_dir=$(pwd)
src_dir=$base_dir/src/main/java
ic_api_cp=$base_dir/target/classes

while read f
do
    clazz=${f//\//.}
    clazz=${clazz/%.java/}
    seruidstr=$(serialver -classpath $ic_api_cp $clazz | cut -d ':' -f 2 | sed -e 's/^\s\+//')
    perl -ni.bak -e "print $_; printf qq{%s\n}, q{    private $seruidstr} if /public class/" $src_dir/$f
done

Você salva esse script, digamos como add_serialVersionUID.shem sua ~/binpasta. Em seguida, você o executa no diretório raiz do seu projeto Maven ou Gradle, como:

add_serialVersionUID.sh < myJavaToAmend.lst

Este .lst inclui a lista de arquivos Java para adicionar o serialVersionUID no seguinte formato:

com/abc/ic/api/model/domain/item/BizOrderTransDO.java
com/abc/ic/api/model/domain/item/CardPassFeature.java
com/abc/ic/api/model/domain/item/CategoryFeature.java
com/abc/ic/api/model/domain/item/GoodsFeature.java
com/abc/ic/api/model/domain/item/ItemFeature.java
com/abc/ic/api/model/domain/item/ItemPicUrls.java
com/abc/ic/api/model/domain/item/ItemSkuDO.java
com/abc/ic/api/model/domain/serve/ServeCategoryFeature.java
com/abc/ic/api/model/domain/serve/ServeFeature.java
com/abc/ic/api/model/param/depot/DepotItemDTO.java
com/abc/ic/api/model/param/depot/DepotItemQueryDTO.java
com/abc/ic/api/model/param/depot/InDepotDTO.java
com/abc/ic/api/model/param/depot/OutDepotDTO.java

Este script usa a ferramenta serialVer JDK. É ideal para uma situação em que você deseja alterar um grande número de classes que não tinham serialVersionUID definido em primeiro lugar, mantendo a compatibilidade com as classes antigas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.