0Pricing
Java Academy · Aula

Campos transient e serialVersionUID

Exclua campos sensíveis com transient e mantenha a compatibilidade entre versões com serialVersionUID.

Campos transient e serialVersionUID é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.

Por que transient?

Alguns campos não devem ser salvos: senhas, identificadores de arquivos abertos e cálculos armazenados em cache. Marque-os como transient para que sejam ignorados durante a serialização.

public class Session implements Serializable {
    private String username;
    private transient String password;   // NOT serialized
    private transient Connection dbConn; // NOT serialized
}

Valor de um Campo transient Após a Desserialização

Após a desserialização, os campos transient recebem o valor padrão de Java: null para objetos, 0 para números e false para valores booleanos.

Session s = (Session) ois.readObject();
System.out.println(s.username);  // "alice"
System.out.println(s.password);  // null  (transient)

O que é serialVersionUID?

serialVersionUID é uma constante long que funciona como um marcador de versão. Se a classe for alterada e o UID não corresponder ao que está no arquivo, a desserialização lançará InvalidClassException.

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
}

UID Gerado Automaticamente versus UID Explícito

Se você omitir serialVersionUID, Java gerará um a partir da estrutura da classe. Qualquer alteração em um campo mudará o UID silenciosamente, impedindo o uso dos dados antigos. Sempre o declare explicitamente.

import java.io.ObjectStreamClass;
long uid = ObjectStreamClass.lookup(User.class).getSerialVersionUID();
System.out.println(uid); // e.g. 3526749255685047947

InvalidClassException por Incompatibilidade de Versão

Ao ler dados serializados antigos com uma classe cujo UID foi alterado, Java lançará InvalidClassException: local class incompatible: stream classdesc serialVersionUID = X, local class serialVersionUID = Y.

Evolução Segura de Classes

Você pode adicionar novos campos com segurança a uma classe serializável sem alterar o UID. Fluxos antigos serão desserializados com o novo campo recebendo seu valor padrão. Remover ou renomear campos é mais perigoso.

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;
    private String email; // Added in v2 — safe if UID unchanged
}

transient com Inicialização Preguiçosa

Um padrão comum é marcar um campo armazenado em cache ou derivado como transient e recalculá-lo sob demanda após a desserialização usando readResolve ou o método de acesso.

public class Document implements Serializable {
    private static final long serialVersionUID = 1L;
    private String content;
    private transient int wordCount = -1;
    public int getWordCount() {
        if (wordCount == -1) wordCount = content.split("\\s+").length;
        return wordCount;
    }
}

Campos estáticos Nunca São Serializados

Campos static pertencem à classe, não à instância. Eles nunca são incluídos no fluxo serializado — apenas os campos de instância são serializados.

public class Counter implements Serializable {
    private static final long serialVersionUID = 1L;
    private static int instanceCount = 0; // NOT serialized
    private int value;
}

Usando a Ferramenta serialver

A ferramenta serialver do JDK imprime o serialVersionUID padrão de uma classe: serialver com.example.User. Use-a para obter o valor antes de adicioná-lo explicitamente.

Externalização como Alternativa

Externalizable estende Serializable e oferece controle total por meio de writeExternal / readExternal — útil quando você deseja controlar explicitamente os campos sem usar transient.

public class Config implements Externalizable {
    private String host;
    private transient String secret;
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(host);
    }
    public void readExternal(ObjectInput in) throws IOException {
        host = in.readUTF();
    }
}

Práticas Recomendadas

Sempre declare serialVersionUID. Marque senhas, identificadores e dados armazenados em cache como transient. Incremente o UID ao fazer alterações incompatíveis. Documente o histórico de versões.

Verificação Rápida

Que valor um campo int transient terá após a desserialização?

Recapitulação

Use transient para excluir campos da serialização. Sempre declare serialVersionUID para controlar o versionamento. Campos estáticos nunca são serializados, independentemente de qualquer outra coisa.

Perguntas Frequentes

A aula “Campos transient e serialVersionUID” é grátis?

Sim — o texto completo de “Campos transient e serialVersionUID” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.

O que vou aprender em “Campos transient e serialVersionUID”?

Exclua campos sensíveis com transient e mantenha a compatibilidade entre versões com serialVersionUID. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Java Academy?

Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Campos transient e serialVersionUID”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Java Academy?

Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Fundamentos da Serialização em Java
  2. Campos transient e serialVersionUID
  3. Serialização Personalizada: writeObject e readObject
  4. Alternativas Modernas: JSON e Protocol Buffers
← Voltar para Java Academy