Serializarea obiectelor
Î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().
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;
}