"Emlékszel, hogy ma megvizsgáltuk az objektumok fájlba mentését és kiolvasását?"

"Igen, most mentettük egy kimeneti adatfolyamba, egy bemeneti adatfolyamból olvastunk."

"Jól van, Amigo. Jó hallani, hogy észreveszed ezeket a részleteket. Be tudnád fejezni a kódot úgy, hogy az egy fájlba mentse és olvassa azt?"

"Mit kell befejezni? Deklaráljon egy FileInputStream és FileOutputStream fájlt, és adja át őket a mentési és betöltési metódusoknak. Nincs itt semmi összetévesztendő. Szuper egyszerű."

"Örülök neked. Most egy új téma: a sorozatosítás ."

A sorozatosítás szinte ugyanaz, mint amit az imént csináltunk, de sokkal menőbb, és közvetlenül a Java gépbe van beépítve. A Java gép képes tárolni és betölteni objektumait. Még a mentési és betöltési módszerek sem szükségesek hozzá: minden objektum a Java gépen belül van tárolva, és teljes hozzáféréssel rendelkezik hozzájuk."

Csak vesszük az objektumot és mentjük egy adatfolyamba, és olvasunk egy adatfolyamból:

Kód
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;
}

"Ez az?"

"Pontosan. Van egy nagyon nagy és összetett szerializációs mechanizmus, amely lehetővé teszi, hogy adatfolyamba mentsük, és szinte bármilyen adattípusú adatfolyamból olvassunk."

"Majdnem bármelyik. Tehát nem bármilyen adattípus?"

"Igen, a tény az, hogy nem minden objektum rendelkezik azzal a képességgel, hogy el lehessen menteni . Egyes objektumok nem tárolják az összes adatukat belsőleg. Ehelyett csak hivatkoznak más objektumokra és/vagy adatforrásokra. Például a konzolra (System. in), bemeneti adatfolyam (InputStream) és egyéb dolgok."

Ezért találták ki a Java alkotói a speciális Serializable interface markert . Markernek hívják , mert nem tartalmaz adatokat és metódusokat. Csak osztályok „címkézésére” vagy „megjelölésére” használják. Ha úgy gondoljuk, hogy az osztályunk minden adatát belsőleg tárolja, akkor a Serializable implementsokkal megjelölhetjük .

Íme egy „macska” példa a szerializálás támogatásával:

Kód
class Cat implements Serializable
{
 public String name;
 public int age;
 public int weight;
}

Amikor megpróbálunk szerializálni (elmenteni) egy objektumot, a Java gép ellenőrzi, hogy támogatja-e a szerializálást: Megvalósítja-e a Serializable interfészt? Ha igen, akkor elmenti az objektumot. Ha nem, akkor kivételt dob, jelezve, hogy a sorozatosítás lehetetlen.
Itt meg kell értened, hogy egy szerializálható objektum csak szerializálható objektumokból állhat.

"Nos, ennek van értelme. Nem mentheti meg az egészet a részek mentése nélkül."

"Pontosan."

– És mi a helyzet az int-ekkel, a Strings-szel és az ArrayList-ekkel?

"Mindannyian támogatják a szerializálást. A Java készítői különös gondot fordítottak arra, hogy ez megtörténjen. Itt nem lehet semmi probléma."

Ezenkívül az objektum típusa elmentésre kerül, amikor az objektumot szerializálják. Most már elmenthet egy hivatkozást egy Cat objektumra egy objektumváltozóba. Minden rendben lesz sorozatosan és deszerializálva.

– Deszerializálni?

" A deszerializáció a szerializálás megfordításának folyamata: egy objektum beolvasása és rekonstrukciója egy adatfolyamból/fájlból."

– Ó, akkor nincs több kérdés.