Dúvida: Converter um obj1 em um obj2 que estende o obj1 [RESOLVIDO]

Pessoal, olá à todos. Estou desenvolvendo um simples programinha para gestão comercial dos pequenos comércios do meu bairro. Eu estava salvando meus objetos criando uma pasta para o mesmo, e salvando um arquivo de texto para cada atributo. Um cliente por exemplo, possuía sua pasta com seu nome e dentro os arquivos NOME, VAL_JÁ_COMPRADO, E-MAIL, etc… Porque assim eu poderia salvar ou ler um de cada vez dependendo da necessidade. Depois pensei em usar Properties para salvar tudo e ler de forma mais fácil, mas não gostei. Até que descobri o ObjectOutputStream <3 perfeito! Mas pensei, quando eu chegar num momento que eu precise criar uma atualização no meu programa, e o cliente, por exemplo, precise receber uma atualização e eu tenha que adicionar uma nova variável nele, o método ObjectInputStream me retorna um erro :/.
Então pensei que poderia criar um novo cliente que estendesse o primeiro, mas também dá erro. Exemplo.

Cliente cliente = new Cliente2(); //Assim funciona.
Cliente2 cliente = new Cliente(); //Assim não funciona.

Então fica a dúvida, alguém sabe uma forma de me ajudar? Como eu poderia fazer minhas atualizações de maneira fácil usando esse sistema? Única forma que consegui pensar foi a cada atualização, criar uma classe que lesse cada cliente, criasse um cliente2 e copiasse manualmente (digo eu escrevendo o código para copiar) cada um dos atributos do cliente passando-os para o cliente2 e então salvasse ele sobrescrevendo o cliente1. Mas ai meu programa teria que fazer isso em todos os arquivos que estivessem recebendo a atualização e dependendo do número, poderia levar muito tempo.

Fiz com ObjectOutputStream porque com arquivos de texto um pedidoDeCliente pesava 86kb, e com dessa outra forma pesa somente 1,1kb. Sem falar na facilidade de salvar e carregar.

Desde logo, obrigado.
PS: Se estiver na área errada, perdão.

É por isso que toda classe que implementa Serializable declara um atributo estático chamado serialVersionUid, se você adiciona um novo atributo, deveria mudar esse número.

Se existe a possibilidade de seu sistema mudar no futuro, então não utilize ObjectOutputStream/ObjectInputStream.

Porque não salva as informações em um banco de dados?

Isso não é demorado. Mas ainda acho melhor você persistir suas informações em um banco de dados.

Não estou usando banco de dados porque como estou fazendo para clientes bem simples, queria que fosse de fácil “instalação”. Dessa forma ai tudo que precisa fazer é copiar o arquivo Caixa.jar pra área de trabalho.

Muito obrigado pela dica, não sabia desse serialVersion.

Acho que vou acabar optando por usar MySQL ou algo do tipo mesmo.

Sim, mas isso não vai resolver o erro quando você adicionar novos atributos.

Se você realmente quer continuar utilizando ObjectOutputStream/ObjectIntputStream para serializar objetos em arquivo, então sugiro ler a documentação da interface Serializable e implementar os métodos privados especiais para tratar sua serialização, aí quando for adicionar novos atributos, poderá tratar nestes métodos a leitura de objetos antigos.

Pode usar um banco de dados relacional como o Apache Derby que pode ser embutido na sua aplicação. Assim não vai precisar de um SGBD a parte instalado na maquina do cliente.