Serialização de Objetos

7 respostas
lauro91

Olá, estou com um problema em serialização de objetos, especificamente na leitura dos objetos serializados.

Quando uso esse trecho de código, que me permite a escrita no arquivo, consigo escrever e ler todos os registros, porém tem o inconveniente de toda vez que o programa executa o conteúdo do arquivo é sobrescrito

ObjectOutputStream fileOutput = new ObjectOutputStream(new FileOutputStream(nome)); fileOutPut.writeObject(objeto);

Já usando dessa segunda forma conforme código abaixo, não consigo fazer a leitura dos objetos gravados no arquivo,nesse construtor com dois argumentos do FileOutPutStream, o segundo argumento, se true, grava no fim do arquivo e não sobrescreve o que já que existia.

ObjectOutputStream fileOutput = new ObjectOutputStream(new FileOutputStream(nome,true)); fileOutPut.writeObject(objeto);

Fazendo a leitura com essa segunda forma, gera uma exceção: java.io.StreamCorruptedException: invalid type code: AC

Alguma solução?

Grato.

7 Respostas

rodpuc

Oq vc quer escrever é texto?
Pq não usa o fileOutputStream.write()?

lauro91

Não é texto , estou tentando gravar objetos no arquivo, por isso se usa o ObjectOutPutStream.

rodpuc

Me parece meio estranho persistir mais de um objeto em um mesmo arquivo, não sei como ajudar mas se alguém souber vou acompanhar para aprender também.

lauro91

Ok!

matheuslmota

Vejamos o que a documentação nos diz:
http://java.sun.com/javase/technologies/core/basic/serializationFAQ.jsp#appendSerialStream

O que ocorre é o seguinte. Por padrão, quando você usa o ObjectOutputStream para escrever um objeto serializável em um arquivo, além do objeto, é escrito um cabeçalho que o ObjectInputStream irá usar para ler o arquivo e desserializar o objeto. Para poder anexar vários objetos serializados em um arquivo, você deve extender a classe ObjectOutputStream e sobrescrever o método writeStreamHeader(). Dentro dele, você deve chamar o método reset da classe ObjectOutputStream. Ou seja:

public class AppendableObjectOutputStream extends ObjectOutputStream { protected void writeStreamHeader() { super.reset(); } }

O método reset ignora o estado de objetos já adicionados na sua stream.
Você agora irá usar seu código da seguinte maneira:

AppendableObjectOutputStream fileOutput = new AppendableObjectOutputStream(new FileOutputStream(nome,true)); fileOutPut.writeObject(objeto);

Não se esqueça de chamar o flush e o close após colocar todos os objetos.

ViniGodoy

Por favor, ao criar tópicos, não os destaque com o óbvio, tal como [Ajuda], [Dúvida], [Socorro] ou [Urgente].

Deixe as tags para marcações importantes tais como [ObjectInputStream] ou [Resolvido].

lauro91

Obrigado pela alternativa, mas ela não solucionou, continua com problemas na leitura , agora dispara a exceção java.io.StreamCorruptedException: invalid stream header.

Criado 23 de junho de 2012
Ultima resposta 26 de jun. de 2012
Respostas 7
Participantes 4