„Îți vei aminti că astăzi am investigat salvarea obiectelor și citirea lor dintr-un fișier?”

„Da, tocmai am salvat într-un flux de ieșire, o citire dintr-un flux de intrare.”

"Bravo, Amigo. Mă bucur să aud că observi aceste detalii. Ai fi capabil să completezi codul astfel încât să salveze și să citească dintr-un fișier?"

"Ce finalizați?! Declarați un FileInputStream și FileOutputStream și treceți-le la metodele de salvare și încărcare. Nu este nimic de confundat aici. Super simplu."

"Mă bucur pentru tine. Acum pentru un subiect nou: serializarea ."

Serializarea este aproape aceeași cu ceea ce tocmai am făcut, dar mult mai cool și integrată chiar în mașina Java. Mașina Java își poate stoca și încărca obiectele. Nici măcar nu are nevoie de metodele de salvare și încărcare pentru a face acest lucru: toate obiectele sunt stocate în mașina Java și are acces deplin la ele.”

Luăm obiectul și îl salvăm într-un flux și citim dintr-un flux:

Cod
public static void main(String[] args) throws Exception
{
 Cat cat = new Cat();

 //Save a cat to file
 FileOutputStream fileOutput = new FileOutputStream("cat.dat");
 ObjectOutputStream outputStream = new ObjectOutputStream(fileOutput);
 outputStream.writeObject(cat);
 fileOutput.close();
 outputStream.close();

 //Load a cat from file
 FileInputStream fiStream = new FileInputStream("cat.dat");
 ObjectInputStream objectStream = new ObjectInputStream(fiStream);
 Object object = objectStream.readObject();
 fiStream.close();
 objectStream.close();

 Cat newCat = (Cat)object;
}

"Asta este?"

"Exact. Există un mecanism de serializare foarte mare și complex care ne permite să salvăm într-un flux și să citim dintr-un flux de aproape orice tip de date."

— Aproape oricare. Deci nu orice tip de date?

„Da, adevărul este că nu toate obiectele au capacitatea inerentă de a fi salvate . Unele obiecte nu stochează toate datele lor intern. În schimb, ele fac referire doar la alte obiecte și/sau surse de date. De exemplu, consola (System. in), un flux de intrare (InputStream) și alte lucruri."

De aceea, creatorii Java au venit cu marcatorul special de interfață Serializable . Se numește marker , deoarece nu conține date și metode. Este folosit doar pentru a „eticheta” sau „marca” clasele. Dacă credem că clasa noastră stochează toate datele interne, atunci o putem marca cu implemente Serializable .

Iată un exemplu de „pisică” cu suport pentru serializare:

Cod
class Cat implements Serializable
{
 public String name;
 public int age;
 public int weight;
}

Când încercăm să serializăm (salvam) un obiect, mașina Java verifică dacă acceptă serializarea: Implementează interfața Serializable? Dacă o face, atunci salvează obiectul. Dacă nu, atunci se aruncă o excepție pentru a indica faptul că serializarea este imposibilă.
Aici trebuie să înțelegeți că un obiect serializabil trebuie să fie format numai din obiecte serializabile.

"Ei bine, asta are sens. Nu poți salva întregul fără să-i salvezi părțile."

"Exact."

„Și ce zici de int, Strings și ArrayLists?”

"Toți acceptă serializarea. Creatorii Java au avut grijă în mod deosebit să se asigure că acest lucru se întâmplă. Nu ar trebui să fie probleme aici."

Mai mult, tipul unui obiect este salvat atunci când obiectul este serializat. Acum puteți salva o referință la un obiect Cat într-o variabilă Object. Totul se va serializa și deserializa foarte bine.

— Deserializare?

Deserializarea este procesul de inversare a serializării: citirea și reconstruirea unui obiect dintr-un flux/fișier.”

— Ah, atunci nu mai există întrebări.