Questao Serialização - writeObject e readObject

3 respostas
Gustavo_Santos

Boa tarde galera!

Acertei uma questão aqui no testKiller sobre serialização, porém não tenho
certeza sobre a veracidade da mesma, segue:

import java.io.*;

public class Foo implements Serializable {
	
	public int x, y;
	
	public Foo(int x, int y) {
		this.x = x;
		this.y = y;
	}
	
	private void writeObject(ObjectOutputStream s) throws IOException {
		s.writeInt(x);
		s.writeInt(y);
	}
	
	private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
                 //insert code here
	}

}

E pergunta o que inserido na parte //insert code here, faria a classe serializar e desserializar
corretamente.

As opções:

A. s.defaultReadObject();
D. x = s.readInt(); y = s.readInt();

Marquei a D pelo fato de que li vo livro da Keity que devo fazer a leitura
de acordo como fiz a escrita.

Ela diz também que posso escrever e ler os dados que desejo “serializar na mão” antes ou depois
de defaultReadObject(); e defaultWriteObject(); mais de qualquer forma preciso chamar esses, para que
o processo normal de serialização no objeto em questão aconteça.

A dúvida é simple - esta questão está com a resposta correta ?

3 Respostas

Gustavo_Santos

Em uma outra questão:

Given:

10. public class Foo implements java.io.Serializable {
11. private int x;
12. public int getX() { return x; }
13. publicFoo(int x) { this.x=x; }
14. private void writeObject( ObjectOutputStream s )
15. throws IOException {
16. // insert code here
17. }
18. }

Which code fragment, inserted at line 16, will allow Foo objects to be correctly serialized and
deserialized?

A. s.writeInt(x);
B. s.serialize(x);
C. s.writeObject(x);
[b] D. s.defaultWriteObject(); [/b]

Nesse caso a resposta correta foi a D. Iaiii na minha consepção é o mesmo caso

Gustavo_Santos

Alguém ???

charlesbraw

Gustavo,
Também estou estudando esse assunto … é bem interessante né hehhe…

Fiz o teste aqui da sua pergunta e funcionou perfeitamente, você serializou “na mão” e pegou “na mão”.

veja o resultado:

package declaracoes;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

class Foo implements Serializable {
    public int x, y;  
    
    Foo(){}
    public Foo(int x, int y) {  
        this.x = x;  
        this.y = y;  
    }  
      
    private void writeObject(ObjectOutputStream s) throws IOException {  
    	s.writeInt(8);  
    	s.writeInt(9);  
    }  
      
    private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {  
    	 x =s.readInt(); y = s.readInt();   
    }	
	
}

class Main3 {
	
	public static void main(String[] args) {
		Foo f = new Foo(2,5);
		System.out.print(f.x);
		System.out.print(f.y);
		try{
			FileOutputStream fo = new FileOutputStream("C:\\bb.txt");
			ObjectOutputStream ob = new ObjectOutputStream(fo);
			ob.writeObject(f);
			ob.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
	
		try{
			FileInputStream fo = new FileInputStream("C:\\bb.txt");
			ObjectInputStream ob = new ObjectInputStream(fo);
			f = (Foo)ob.readObject();
			ob.close();
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		System.out.print(f.x);
		System.out.print(f.y);
	}
}

saida: 25
89

Veja que dentro do método padrão writeObject, eu coloquei os valores diretamente para ver que pegou novos valores e não do objeto atual.

Criado 12 de setembro de 2010
Ultima resposta 14 de set. de 2010
Respostas 3
Participantes 2