Usando readClassDescriptor () e talvez resolveClass () para permitir o versionamento de serialização

Eu estou investigando diferentes opções no mecanismo de serialização Java para permitir flexibilidade em nossas estruturas de classe para armazenamento tolerante a versão (e defendendo um mecanismo diferente, você não precisa me dizer).

Por exemplo, o mecanismo de serialização padrão pode manipular a adição e a remoção de campos, se somente a compatibilidade com versões anteriores for necessária.

Renomear uma classe ou movê-la para um pacote diferente provou ser muito mais difícil. Eu encontrei emessa questão que eu era capaz de fazer uma classe simples renomear e / ou mover o pacote, subclassificando ObjectInputStream e sobrescrevendo readClassDescriptor ():

    if (resultClassDescriptor.getName().equals("package.OldClass"))
        resultClassDescriptor = ObjectStreamClass.lookup(newpackage.NewClass.class);

Isso é bom para renomeações simples. Mas se você tentar adicionar ou excluir um campo, você receberá um java.io.StreamCorruptedException. Pior, isso acontece mesmo que um campo tenha sido adicionado ou excluído, eentão você renomeia a classe, o que poderia causar problemas com vários desenvolvedores ou vários checkins.

Com base em algumas leituras que fiz, experimentei um pouco com a resolução resolveClass (), com a ideia de que estávamos repondo corretamente o nome para a nova classe, mas não carregando a própria classe antiga e bombardeando as alterações de campo. Mas isso vem de uma compreensão muito vaga de alguns dos detalhes do mecanismo de serialização, e não tenho certeza se estou latindo até mesmo na árvore certa.

Então, 2 perguntas precisas:

Por que está repondo o nome da classe usando readClassDescriptor () fazendo com que a desserialização falhe em alterações de classe normais e compatíveis?Existe uma maneira de usar resolveClass () ou outro mecanismo para contornar isso e permitir que as classes evoluam (adicionar e remover campos) e sejam renomeadas / reembaladas?

Eu investiguei e não consegui encontrar uma pergunta equivalente sobre o SO. Seja como for, indique-me a essa pergunta se ela existe, mas, por favor, leia a questão com bastante atenção para que você não me feche, a menos que outra pergunta realmente responda à minha pergunta precisa.

questionAnswers(4)

yourAnswerToTheQuestion