Serializarea obiectelor

De la WikiLabs
Jump to navigationJump to search

În afară de fluxurile de I/O despre care s-a discutat în detaliu în capitolul de fluxuri, limbajul Java pune la dispoziția programatorilor o noțiune puternică de serializare a obiectelor. Știm deja că o clasă este o structură ce încapsulează date și funcționalitate. Serializarea este procedeul prin care datele încapsulate în instanța unei clase sunt trimise și primite cu ajutorul unui flux de I/O. Clasele care realizează acest lucru sunt java.io.ObjectOutputStream și java.io.ObjectInputStream iar metodele cele mai utilizate sunt writeObject(Object) și readObject().

Regulă: Pentru ca o clasă să poate fi serializată (sau mai bine zis, pentru ca obiectele instanțe ale acelei clase să poată fi serializate), clasa trebuie să implementeze interfața java.io.Serializable:


public class Question implements Serializable{

    public String questionBody;
    public String[] answers;
    public int correctAnswerIndex;

}

Scrierea obiectelor

Un ObjectOutputStream este, ca și clasa FilterOutputStream, un "wrapper", adică o înfășurătoare care are nevoie de un alt OutputStream pentru a funcționa. Rolul clasei ObjectOutputStream este de a transforma un obiect într-un șir de octeți care se scriu mai departe pe stream-ul la nivel de octet:

public class ObjectWriter{

public static void main(String[] _args){
    try{
        OutputStream _byteStream = getSomeOutputStream();
        ObjectOutputStream _objectStream = new ObjectOutputStream(_byteStream);
        Question _q1 = new Question();
        _objectStream.writeObject(_q1);
        _objectStream.close();
    }catch(IOException _ioe){
        System.out.println("Unable to write object: " + _ioe.getMessage());
    }
}

public static OutputStream getSomeOutputStream(){
    //...
}

}

Câmpurile statice nu sunt serializate (serializarea se referă la obiect și nu la clasă). Dacă obiectul serializat conține referințe la alte obiecte, acestea sunt și ele serializate automat urmând aceleaşi reguli.

În plus, pentru a proteja un câmp la serializare, se poate folosi modificatorul transient. Câmpurile transient nu se serializează:

public class Question implements Serializable{

    public String questionBody;
    public String[] answers;
    public transient int correctAnswerIndex;

}

Citirea obiectelor