Problemas com Serialização

Galera, estou tendo um pequeno problema na serialização de objetos. Eu sei que o uso de serialização não é recomendado em muitos casos, mas neste caso… é preciso.

[list] :arrow: Ao escrever os objetos, ele não esvazia o buffer e, dependendo do volume de objetos, gera OutOfMemory, utilizando o seguinte código:

... oos.writeObject(objeto); oos.flush(); ...

Procurei na especificação e verifiquei que nem sempre o flush realmente esvazia o buffer, para solucionar, fecho o ObjectOutputStream de tempos em tempos e abro novamente (com o truque do NoHeaderOutputStream para appendar os objetos)

Minha dúvida, há alguma outra maneira de solucinar?[/list]

[list] :arrow: Ao abrir o arquivo que serializei, preciso saber quantos objetos há dentro do ObjectInputStream. Procurei no javadoc e pelo Google mas não obtive sucesso. A única maneira que consegui resolver isso foi percorrendo todo o stream (mas isso acarreta queda de performance e pode gerar um OutOfMemoryError) na bufferização do Stream.

Uma alternativa seria eu gravar no arquivo também quantos registros eu gravei lá, suponha que eu faça o seguinte:

... long quantos = 0; oos.writeLong(quantos); ... Iterator i = ...; for (; i.hasNext; quantos++) { oos.writeObject(i.next()); oos.flush(); } ...

Minha dúvida? Há algum seek ou algo do tipo para que eu possa sobrescrever o long que escrevi no começo do arquivo?[/list]

Obrigado!

Bom, sao duas perguntas, a segunda é mais fácil de responder:

Serializa um objeto só: um List que implemente Serializable. Besteira gastar tempo com isso…

Mas suponhamos que vc queira gastar tempo com isso… perai!!

Em que tipo de Stream vc tá seriando seus objetos?? Na memória?? Como que te dá OutOfMemory??

Bom, suponha que vc quer gastar tempo com isso, vc pode sobrescrever (override) o método writeObject(ObjectOutputStream out). Um método “secreto” da classe Object com a assinatura seguinte:

public void writeObject(ObjectOutputStream out) throws IOException;
public void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;

No readObject, vc pode imaginar que vc está no construtor da instancia, e ainda nao chamou super(). Nesse caso, em vez de super() vc tem que chamar super.readObject(in).

Com esses dois métodos, vc tem total controle sobre a escrita e leitura dos membros do objeto, incusive pode passar por cima de conceitos como “transient”, se nao me engano. Mas a responsabilidade é toda sua de fazer a coisa direito. Em tese, vc nao precisa nem usar o esquema normal de gravar objetos, vc pode considerar o stream como um DataOutput/DataInput, pode encriptar, fazer o diabo. Mas vc mesmo tem que saber ler. Achei um texto de qualidade média aqui, eu sei que existe um melhor, procura no google.

[]s!!!