"Du kommer ihåg att vi idag undersökte hur vi sparade föremål till och läste dem från en fil?"

"Ja, vi har precis sparat till en utgångsström, en läsning från en ingångsström."

"Bra gjort, Amigo. Det är bra att höra att du lägger märke till dessa detaljer. Skulle du kunna komplettera koden så att den sparas till och läser från en fil?"

"Slutför vad?! Deklarera en FileInputStream och FileOutputStream och skicka dem till metoderna för att spara och ladda. Det finns inget att förvirra om här. Superenkelt."

"Jag är glad för din skull. Nu till ett nytt ämne: serialisering ."

Serialisering är nästan samma som vi just gjorde, men mycket coolare och inbyggd direkt i Java-maskinen. Java-maskinen kan lagra och ladda sina objekt. Den behöver inte ens spara och ladda metoderna för att göra det: Alla objekt lagras inuti Java-maskinen och den har full åtkomst till dem."

Vi tar bara objektet och sparar det i en stream och läser från en stream:

Koda
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;
}

"Det är allt?"

"Precis. Det finns en mycket stor och komplex serialiseringsmekanism som låter oss spara till en ström och läsa från en ström av nästan vilken datatyp som helst."

"Nästan vilken som helst. Så ingen datatyp?"

"Ja, faktum är att inte alla objekt har den inneboende förmågan att sparas. Vissa objekt lagrar inte all sin data internt. Istället refererar de bara till andra objekt och/eller datakällor. Till exempel konsolen (System. in), en indataström (InputStream) och andra saker."

Det är därför Javas skapare kom med den speciella Serializable- gränssnittsmarkören . Det kallas en markör eftersom det inte innehåller några data eller metoder. Den används bara för att "tagga" eller "märka" klasser. Om vi ​​tror att vår klass lagrar all sin data internt, kan vi markera det med implementer Serializable .

Här är ett «katt»-exempel med stöd för serialisering:

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

När vi försöker serialisera (spara) ett objekt, kontrollerar Java-maskinen om den stöder serialisering: Implementerar den gränssnittet Serializable? Om den gör det sparar den objektet. Om inte, ger den ett undantag för att indikera att serialisering är omöjlig.
Här måste du förstå att ett serialiserbart objekt endast får bestå av serialiserbara objekt.

"Tja, det är vettigt. Du kan inte rädda helheten utan att spara dess delar."

"Exakt."

"Och hur är det med ints, Strings och ArrayLists?"

"De stöder alla serialisering. Javas skapare var särskilt noga med att se till att detta hände. Det borde inte vara några problem här."

Dessutom sparas ett objekts typ när objektet serialiseras. Nu kan du spara en referens till ett Cat-objekt i en Object-variabel. Allt kommer att serialiseras och deserialiseras bra.

"Deserialisera?"

" Deserialisering är processen att vända serialisering: läsa och rekonstruera ett objekt från en ström/fil."

"Ah, inga fler frågor då."