o que causa problemas de desserialização?
Eu gostaria de lhe dar um pouco de fundo antes de responder sua pergunta,
O runtime de serialização associa a cada classe serializável um número de versão, chamado serialVersionUID, que é usado durante a desserialização para verificar se o remetente e o destinatário de um objeto serializado carregaram classes para esse objeto que são compatíveis com relação à serialização. Se o receptor carregou uma classe para o objeto que tem uma serialVersionUID diferente daquela da classe do remetente correspondente, a desserialização resultará em uma InvalidClassException.
Se uma classe serializável não declarar explicitamente um serialVersionUID, o tempo de execução de serialização calculará um valor serialVersionUID padrão para essa classe com base em vários aspectos da classe. Ele usa as seguintes informações da classe para calcular SerialVersionUID,
- O nome da classe.
- Os modificadores de classe escritos como um inteiro de 32 bits.
- O nome de cada interface classificado por nome.
- Para cada campo da classe classificado por nome de campo (exceto campos estáticos privados e transitórios privados:
- O nome do campo.
- Os modificadores do campo escritos como um inteiro de 32 bits.
- O descritor do campo.
-
se existir um inicializador de classe, escreva o seguinte:
O nome do método, .
O modificador do método, java.lang.reflect.Modifier.STATIC, escrito como um inteiro de 32 bits.
O descritor do método, ()V.
-
Para cada construtor não privado classificado por nome de método e assinatura:
O nome do método, .
Os modificadores do método escrito como um inteiro de 32 bits.
O descritor do método.
-
Para cada método não privado classificado por nome de método e assinatura:
O nome do método.
Os modificadores do método escrito como um inteiro de 32 bits.
O descritor do método.
Então, respondendo sua pergunta,
A remoção de uma propriedade pública/privada causaria algum problema? Adicionando novas propriedades, talvez? A adição de uma nova função à classe criaria problemas? Que tal mais construtores?
Sim, todas essas adições/remoções por padrão causarão o problema.
Mas uma maneira de superar isso é definir explicitamente o SerialVersionUID, isso informará ao sistema de serialização que eu sei que a classe evoluirá (ou evoluiu) ao longo do tempo e não gerará um erro. Assim, o sistema de desserialização lê apenas os campos que estão presentes em ambos os lados e atribui o valor. Os campos recém-adicionados no lado de desserialização obterão os valores padrão. Se alguns campos forem excluídos no lado da desserialização, o algoritmo apenas lê e pula.
A seguir está a maneira como se pode declarar o SerialVersionUID,
private static final long serialVersionUID = 3487495895819393L;