[Resolvido]Ler vários argumentos em writeObject - Serialização

5 respostas
gRoOve

Não estou conseguindo carregar um objeto transient usando o método readObject para serializar na unha objetos. Segue meu código:

package scjpserializarobjeto;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class Pessoa implements Serializable  {
	String nome;
	int idade;
	double peso;
	transient Relogio relogio;

	Pessoa(String nome, int idade, double peso, Relogio rel){
		this.nome = nome;
		this.idade = idade;
		this.peso = peso;
		this.relogio = rel;
	}

	private void writeObject(ObjectOutputStream os){
		try {
			os.defaultWriteObject();
			os.writeChars(relogio.marca);
			os.writeInt(relogio.tamanho);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void readObject(ObjectInputStream is){
		try {
			is.defaultReadObject();
			relogio = new Relogio(is.readLine(), is.readInt());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Quando executo este código, ocorre este erro:

run:
java.io.EOFException
        at java.io.DataInputStream.readInt(DataInputStream.java:375)
jose
        at java.io.ObjectInputStream$BlockDataInputStream.readInt(ObjectInputStream.java:2775)
        at java.io.ObjectInputStream.readInt(ObjectInputStream.java:949)
        at scjpserializarobjeto.Pessoa.readObject(Pessoa.java:33)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
        at scjpserializarobjeto.Main.main(Main.java:29)
Exception in thread "main" java.lang.NullPointerException
        at scjpserializarobjeto.Main.main(Main.java:33)
Java Result: 1
CONSTRUÍDO COM SUCESSO (tempo total: 1 segundo)

Embaixo de “jose”, deveria printar um atributo da classe relogio chamado marca e outro chamado tamanho.

5 Respostas

R

o erro esta na linha:

relogio = new Relogio(is.readLine(), is.readInt());

precisa ver como está essa classe…

gomesrod

Olá,

O problema é que você escreve a String com writeChars, e lê com readLine. O writeChars e readLine não formam um “par”, como writeInt e readInt. Este método readLine faz a leitura do stream até encontrar uma quebra de linha, não é a mesma coisa que pegar a string original.

O erro de EOF (End Of File) provavelmente aontece porque a marca de seu Relógio não tem uma quebra de linha, então o stream acaba sendo lido até o final. Depois vem o readInt e não encontra mais nenhum dado no Stream.

A solução mais simples é usar writeObject e readObject para escrever e ler a string. Assim, o objeto (que é a string Marca) não sofre nenhuma modificação.

gRoOve

gomesrod era exatamente isso :slight_smile:
Cara, eu fiquei procurando outro método para WriteObject/ReadObject que recebesse um argumento String, mas não me liguei que String é um Objeto, hehe.

Só uma dúvida, onde você identificou um EOF no erro? Pode apontar? Não localizei.

Obrigado. Abraço.

gomesrod

Na primeira linha :slight_smile:

gRoOve:

Quando executo este código, ocorre este erro:

run: java.io.EOFException at java.io.DataInputStream.readInt(DataInputStream.java:375)

Deu uma EOFException, que segundo a documentação indica que “o fim de arquivo ou fim da stream foi atingido inesperadamente durante o input”.
http://download.oracle.com/javase/6/docs/api/java/io/EOFException.html

gRoOve

Juro que li várias vezes este trecho e tava vendo um “IOException”, haha.
Vlw pela ajuda.

Criado 4 de julho de 2011
Ultima resposta 5 de jul. de 2011
Respostas 5
Participantes 3