SCJP - Serialização

2 respostas
diegohsi
Olá pessoal. Estou com dúvida no meu seguinte código sobre serialização de objetos. Não consigo jogar o estado de dog1 para dog2 pois não estou conseguindo dar um new em dog2. Tem como fazer isso sem alterar os construtores? Se sim estou no aguardo. Obrigado.
package SerializacaoDes_serializacao;

public class Collar {
    private int collarSize;
    
    public Collar(int size) {
        collarSize = size;
    }
    
    public int getCollarSize() {
        return collarSize;
    }
}
package SerializacaoDes_serializacao;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.lang.Exception;

public class Dog implements Serializable {
    transient private Collar theCollar; // Marcado como transient por que Collar nao é Serializable
    private int dogSize;
    
    public Dog(Collar collar, int size) {
        theCollar = collar;
        dogSize = size;
    }
    
    public Collar getCollar() {
        return theCollar;
    }
    
    public int getDogSize() {
        return dogSize;
    }
    
    private void writeObject(ObjectOutputStream os) {
        try {
            os.defaultWriteObject();
            os.writeInt(theCollar.getCollarSize());
        } catch(Exception exception) {
            exception.printStackTrace();
        }
    }
    
    private void readObject(ObjectInputStream oi) {
        try {
            oi.defaultReadObject();
            theCollar = new Collar(oi.readInt());
        } catch(Exception exception) {
            exception.printStackTrace();
        }
    } 
}
package SerializacaoDes_serializacao;
import java.lang.Exception;
import java.io.*;

public class TesteDogSerializable {
    public static void main(String[] args) {
        
        Collar c1 = new Collar(8);
        Dog dog1 = new Dog(c1, 2);
        
        try {
            FileOutputStream fos = new FileOutputStream("Teste.ser");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(dog1);
            oos.flush();
            oos.close();
        } catch(Exception exception) {
            exception.printStackTrace();
        }
        
        Dog dog2; // Declarei um novo dog2 para jogar os valores serializados de dog1 para dog2
        
        try {
            FileInputStream fis = new FileInputStream("Teste.ser");
            ObjectInputStream ois = new ObjectInputStream(fis);
            dog2 = (Dog) ois.readObject(); // Minha dúvida esta aqui. Porque os valores de dog1 nao foram para dog2 ?
            ois.close();
        } catch(Exception exception) {
            exception.printStackTrace();
        }
        
        System.out.println("dog1\ntheCollar: " + dog1.getCollar().getCollarSize() + 
                            "\ndogSize: " + dog1.getDogSize());
        System.out.println("\n----------------------\n");
        System.out.println("dog2\ntheCollar: " + dog2.getCollar().getCollarSize() + 
                "\ndogSize: " + dog2.getDogSize()); // Erro em dog2
    }
}

2 Respostas

charlesbraw

Atributos dentro de método não são inicializados automaticamente(não recebe valor padrão), você precisa inicializar esse objeto dentro do main.

pra fazer isso troque essa linha:

Dog dog2; // Declarei um novo dog2 para jogar os valores serializados de dog1 para dog2

por essa:

Dog dog2 = null; // Declarei um novo dog2 para jogar os valores serializados de dog1 para dog2
diegohsi

Obrigado CharlesBraw. reealmente eu tinha até me esquecido desse grande detalhe, e olha que ja passei por esse capitulo

deu certo

abrass

Criado 25 de setembro de 2010
Ultima resposta 26 de set. de 2010
Respostas 2
Participantes 2