JavaRush /Kurslar /All lectures for UZ purposes /Serializatsiya. Boshlanishi.

Serializatsiya. Boshlanishi.

All lectures for UZ purposes
Daraja, Dars
Mavjud

— Bugun obyektlarni faylga saqlash va fayldan o'qishni muhokama qilganimizni eslaysanmi?

— Ha, faqat biz chiqarish oqimiga saqlagan edik, o'qishni esa kiritish oqimidan qilganmiz.

— Ajoyib, Amigo. Bunday kichik narsalarni payqashni bilishingni eshitish juda maroqli. Faylga saqlash va fayldan o'qishni amalga oshirish uchun kod yozish mumkin bo'larmidi?

— Nima yozish kerak?! FileInputStream va FileOutputStreamni e'lon qilasan va ularni save & load metodlariga uzatasan. Bu yerda hech narsani chalkashtirib bo'lmaydi — hammasi oddiy.

— Sen uchun xursandman. Demak, yangi mavzu – serializatsiya.

Serializatsiya – bu biz bilan qilgan ishimizga o'xshaydi, lekin ancha zo'r va Java-mashinaga o'rnatilgan. Java-mashinasi o'z obyektlarini saqlash va yuklamoqni biladi. Buning uchun unga hatto save & load metodlari ham kerak emas.

Biz oddiygina obyektni olib, oqimga saqlaymiz/o'qiy olamiz:

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

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

 //load 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;
}

— Va hammasi shu?

— Ha. Bu yerda juda katta va murakkab serializasiya mexanizmi bor, u deyarli barcha ma'lumot turlarini oqimga saqlash va oqimdan o'qishni qo'llab-quvvatlaydi.

— Deyarli barcha, bu degani hammasi emas?

— Ha, masalan, hamma obyektlarni asosan saqlash mumkin emas. Ba'zi obyektlar o'z ma'lumotlarini o'zlarida saqlamaydi, balki boshqa obyektlarga va/yoki ma'lumot manbalariga ishora qiladi. Masalan, konsol (System.in), kiritish oqimi (InputStream), yoki yana boshqa biror narsa.

Shu sababli Java ishlab chiquvchilari maxsus interfeys-marker – Serializableni yaratishdi. Uni marker deb atashadi, chunki u hech qanday ma'lumot va metodlarni o'z ichiga olmaydi. U faqatgina sinflarni "belgilash" (markalash) uchun ishlatiladi. Agar bizning sinfimiz o'z ma'lumotlarini to'liq saqlashini ma'qullasak, unda biz uni ushbu marker bilan belgilashimiz mumkin – implements Serializable deb yozamiz.

"Mushuk" serializatsiya qo'llab-quvvatlovi bilan misol:

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

Biz qaysidur obyektni serializatsiya qilishga (saqlashga) harakat qilganimizda, Java-mashinasi tekshiradi – u serializatsiyani qo'llab-quvvatlaydimi: Serializable interfeysini amalga oshirganmi? Agar ha, u obyektni saqlaydi, agar yo'q – serializatsiya imkonsizligi haqida istisno chiqaradi.
Bu yerda tushunish kerakki, serializatsiya qilinadigan obyekt ham faqat serializatsiya qilinadigan obyektlardan iborat bo'lishi kerak.

— Xo'sh, buni kutish kerak edi. Barcha qismlarini saqlamasdan butunni saqlash mumkin emas.

— Aynan shunday.

— Qanday qilib int, String, ArrayList turlari?

— Ularning barchasi serializatsiyani qo'llab-quvvatlaydi, bu masalada Java ishlab chiquvchilari maxsus g'amxo'rlik qilishgan. Bu yerda muammo bo'lmasligi kerak.

Bundan tashqari, obyektning serializatsiya jarayoni paytida uning turi ham saqlanadi. Endi sen Object turi bilan sinf o'zgaruvchisiga Cat obyektiga havolani saqlashing mumkin, va bularning barchasi ajoyib tarzda serializatsiya va deserializatsiya qilinadi.

— Deserializatsiya?

— Deserializatsiya – bu serializatsiyaga qarshi jarayon – oqimdan/fayldan obyektni o'qish va tiklash jarayoni.

— Unda savollar tugadi.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION