Tem um campo estático na classe que conta as instâncias. Só que ao desserializar, o construtor que incrementa a contagem não é chamado e essa contagem não fica correta. Como eu resolvo isso?
package basico.serializacao;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import common.Console;
import common.OptionParser;
public class Serializacao {
private static final String FILENAME = "serializado.txt";
public static void main(String[] args) {
OptionParser op = new OptionParser(args, "rw");
if (op.optionGiven('w')) {
Pessoa p = new Pessoa("Renato", 22);
escrever(p);
Console.puts("Escrevi " + p);
}
if (op.optionGiven('r'))
Console.puts("Li " + ler());
}
public static void escrever(Pessoa p) {
try {
FileOutputStream fos = new FileOutputStream(FILENAME);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
oos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static Pessoa ler() {
Pessoa p = null;
try {
FileInputStream fis = new FileInputStream(FILENAME);
ObjectInputStream ois = new ObjectInputStream(fis);
p = (Pessoa) ois.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return p;
}
}
class Pessoa implements Serializable {
String nome;
int idade;
static int totalPessoas = 0;
transient int sequencia;
public Pessoa(String nome, int idade) {
this.nome = nome;
this.idade = idade;
this.sequencia = ++totalPessoas;
}
@Override
public String toString() {
return String.format("[%s, %d anos, sequencia=%d, total=%d]",
nome, idade, sequencia, totalPessoas);
}
}
// OBS: na segunda linha, o total refere-se ao objeto criado na primeira
// Veja que depois da desserialização agora há duas instâncias na memória!
//
// Escrevi [Renato, 22 anos, sequencia=1, total=1]
// Li [Renato, 22 anos, sequencia=0, total=1]
