Lendo arquivo serializado - invalid stream header

3 respostas
C

Pessoal; estou com um problema para ler um arquivo que estou serializando.

Primeiramente o modelo de classes que eu salvo em arquivo:

public class ControladoraWrapper implements Serializable {
	
	private static final long serialVersionUID = 1L; //as sub entidades diretas também tem serialversion, mas abaixo destas nem todas.

	private Date dataGeracao;

	private Classe1 classe1;

	private List<Classe2> classe2;
       
        // mais algumas listas de classes, getters e setters.

}

Agora como que estou serializando o meu objeto:

//populo o meu objeto anterior com todos os campos
               wrapper.setDataGeracao(new Date());
		String nomeArquivo = wrapper.getClasse1.getNome() + "_" + sdf.format(wrapper.getDataGeracao()) + ".bin";
		String arquivoCompleto = StringUtils.trim(StaticVars.TempPath) + "/" + StringUtils.trim(nomeArquivo);

ObjectOutputStream outputStream = null;

		try {
			outputStream = new ObjectOutputStream(new FileOutputStream(arquivoCompleto));
			outputStream.writeObject(wrapper);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (outputStream != null) {
					outputStream.flush();
					outputStream.close();
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			} finally {
				try {
					outputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

Finalmente como que eu importo esse arquivo para o sistema, já tentei fazer de diversas vezes, mas sempre encontro o mesmo erro, na mesma linha:

String arquivo = "aaaaa.bin";
	
try {

			ObjectInputStream objectIn = null;

			FileInputStream fileInputStream = new FileInputStream(arquivo);
			BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);

			objectIn = new ObjectInputStream(bufferedInputStream); //aqui ocorre o erro

			try {
				Object object = objectIn.readObject();

				ControladoraWrapper wrapper = (ControladoraWrapper) object;

				System.out.println(wrapper);

			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace(); // chega nesta exception.
		}

O stack trace é :

java.io.StreamCorruptedException: invalid stream header: FFD8FFE0
	at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
	at java.io.ObjectInputStream.<init>(Unknown Source)
        // logs da aplicação e do tomcat.
Como eu coloquei, sempre tenho o mesmo erro quando vou nesse
new ObjectInputStream(bufferedInputStream)
. Tem alguma outra forma de eu deserializar o meu objeto? Ou é algo que estou errando na hora de serializar? Fico agradecido desde já.

3 Respostas

A

Acho mais fácil assim:
http://caucho.com/resin-4.0/examples/hessian-serialize/index.xtp

T
Pela lógica, se você "escreveu" com FileOutputStream, você deve "ler" seu objeto com FileInputStream.
ObjectInputStream objectIn = null;  

FileInputStream fileInputStream = new FileInputStream(arquivo);  
//BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);  
   
//objectIn = new ObjectInputStream(bufferedInputStream); //aqui ocorre o erro 
objectIn = new ObjectInputStream(fileInputStream);
Acredito que seja isto. Não testei.
C

Pessoal, valeu muito. O problema foi mais embaixo e bem mais noob.
Observem que eu não fecho os streams de entrada de dados para desserialização.

Que fique a lição dos autos árabes: "se abriu, feche."

Agora o código ficou assim:

String arquivo = //bla bla bla...

	try {
			FileInputStream fileInputStream = new FileInputStream(arquivo); //abre
			BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); //abre
			ObjectInputStream objectIn = new ObjectInputStream(bufferedInputStream); //abre

			try {
				Object object = objectIn.readObject();

				wrapper = (ControladoraWrapper) object;

				System.out.println(wrapper);

				fileInputStream.close(); //fecha
				bufferedInputStream.close(); //fecha
				objectIn.close(); //fecha

			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

Quando eu fecho os leitores de aquivo, eles também liberam o arquivo para outras operações.

Criado 23 de setembro de 2011
Ultima resposta 23 de set. de 2011
Respostas 3
Participantes 3