Ushbu maqolada biz serializatsiya nima ekanligini va Java-da qanday ishlashini tushuntiramiz.
Shakl 1. Threadsning grafik tasviri
Oqimlar asosan ikki turga bo'linadi:
Kirish
Ob'ektni ketma-ketlashtirish - bu ob'ektning o'zi va u havola qiladigan boshqa ob'ektlarning to'liq nusxasini chiqish oqimidan (masalan, tashqi faylga) saqlash qobiliyatidir. Shunday qilib, ob'ekt kerak bo'lganda bir oz keyinroq seriyalashtirilgan (saqlangan) nusxadan qayta yaratilishi mumkin. JDK 1.1 da joriy qilingan yangi xususiyat bo'lgan ob'ektni ketma-ketlashtirish, tarmoq orqali saqlash yoki uzatish uchun guruhlar yoki alohida ob'ektlarni bit oqimi yoki bayt massiviga aylantirish funksiyasini ta'minlaydi. Va aytib o'tilganidek, berilgan bit oqimi yoki bayt massivi yana Java ob'ektlariga aylantirilishi mumkin.ObjectInputStream
Bu asosan va sinflar tufayli avtomatik ravishda sodir bo'ladi ObjectOutputStream
. Dasturchi Serializable
sinfni yaratishda interfeysni amalga oshirish orqali ushbu funksiyani amalga oshirishga qaror qilishi mumkin. Seriyalashtirish jarayoni, shuningdek, ob'ektni marshallash deb nomlanadi, seriyadan chiqarish esa unmarshaling deb nomlanadi . Seriyalashtirish - bu ob'ektga o'zining nusxasini va ushbu ob'ekt tomonidan havola qilingan barcha boshqa ob'ektlarni tashqi faylga saqlash imkonini beruvchi mexanizm ObjectOutputStream
. Saqlangan ob'ektlar JFrame
turidan qat'i nazar, ma'lumotlar tuzilmalari, diagrammalar, sinf ob'ektlari yoki boshqa ob'ektlar bo'lishi mumkin. Shu bilan birga, ketma-ketlashtirish ob'ektning qaysi turi haqida ma'lumotni saqlaydi, shunda keyinchalik seriyadan chiqarilganda, bu ma'lumot ob'ektning aniq turini qayta yaratish uchun ishlatiladi. Shunday qilib, serializatsiya quyidagi imkoniyatlarni beradi:
- Ob'ektlarni saqlash tizimi, ya'ni: ularning xususiyatlarini tashqi faylga, diskka yoki ma'lumotlar bazasiga saqlash.
- Masofaviy chaqiruv tizimi.
- Ob'ektni tarqatish tizimi, masalan, COM, COBRA kabi dasturiy ta'minot komponentlarida.
- Vaqt o'tishi bilan o'zgaruvchan ma'lumotlardagi o'zgarishlarni aniqlash tizimi.
Oqimlar:
Har bir dastur o'z ma'lumotlarini saqlash joyiga yoki quvurga yozishi kerak va har bir dastur quvur yoki saqlash joyidan ma'lumotlarni o'qishi kerak. Java-da dasturlar yozadigan va ma'lumotlarni o'qiydigan bu kanallar Streams (Stream
) deb ataladi .
- *Oqimlar deb nomlangan bayt oqim sinflari
- *Reader va *Writer deb nomlangan belgilar oqimi sinflari
Qat'iylik
Ob'ektning qat'iyligi - bu ob'ektning yashash qobiliyati yoki, boshqacha qilib aytganda, dasturni bajarishda "omon qolish". Bu shuni anglatadiki, ish vaqtida yaratilgan har qanday ob'ekt JVM scavenger tomonidan bu ob'ekt endi foydalanilmaganda yo'q qilinadi. Ammo agar persistence API amalga oshirilsa, bu ob'ektlar JVM scavenger tomonidan yo'q qilinmaydi, aksincha, ularga "yashash" uchun ruxsat beriladi, bu esa keyingi safar ilova ishga tushirilganda ularga kirish imkonini beradi. Boshqacha qilib aytadigan bo'lsak, qat'iylik ishlayotgan ilovaning ishlash muddatidan qat'i nazar, ob'ekt uchun umr bo'yi borligini anglatadi. Qat'iylikni amalga oshirishning usullaridan biri ob'ektlarni tashqi fayl yoki ma'lumotlar bazasida saqlash va keyin ularni ushbu fayllar yoki ma'lumotlar bazasidan manba sifatida tiklashdir. Bu erda serializatsiya o'ynaydi. JVM ishlayotgan ekan, har qanday doimiy bo'lmagan ob'ekt mavjud. Seriyalashtirilgan ob'ektlar shunchaki oqimga aylantirilgan ob'ektlar bo'lib, ular keyinchalik tashqi faylga saqlanadi yoki saqlash va tiklash uchun tarmoq orqali uzatiladi.Serializable interfeysini amalga oshirish
java.io.Serializable
Har qanday sinf ushbu sinf ob'ektlarini ketma-ketlashtirish uchun interfeysni amalga oshirishi kerak . Interfeysda Serializable
usullar yo'q va faqat sinfni seriyali sifatida aniqlash uchun belgilab qo'yadi. Faqat ketma-ketlashtirilgan sinf ob'ektining maydonlarini saqlash mumkin. Usullar yoki konstruktorlar ketma-ketlashtirilgan oqimning bir qismi sifatida saqlanmaydi. Agar biron bir ob'ekt boshqa ob'ektga havola sifatida ishlasa, u holda ushbu ob'ektning klassi interfeysni amalga oshirsa, ushbu ob'ektning maydonlari ham ketma-ketlashtiriladi Serializable
. Boshqacha qilib aytganda, shu tarzda olingan ushbu ob'ektning grafigi butunlay ketma-ketlashtiriladi. Ob'ekt grafigi daraxt yoki ob'ekt va uning sub'ektlari maydonlarining tuzilishini o'z ichiga oladi. Interfeysni amalga oshirishga yordam beradigan ikkita asosiy sinf Seriliazable
:
ObjectInputStream
ObjectOutputStream
import java.io.*;
public class RandomClass implements Serializable {
// Генерация рандомного значения
private static int r() {
return (int)(Math.random() * 10);
}
private int data[];
// Конструктор
public RandomClass() {
datafile = new int[r()];
for (int i=0; i<datafile.length; i++)
datafile[i]=r();
}
public void printout() {
System.out.println("This RandomClass has "+datafile.length+" random integers");
for (int i=0; i<datafile.length; i++) {
System.out.print(datafile[i]+":");
System.out.println();
}
}
Yuqoridagi kodda seriyali bo'ladigan sinf yaratilgan, chunki serializatsiya interfeysi tomonidan "belgilangan". Sinf uning namunasi yaratilganda tasodifiy butun sonlar qatorini yaratadi. Quyidagi kod yordamida oqimga ob'ektlar yozish imkoniyati ko'rsatilgan ObjectOutputStream
. Dasturda butun sonlar massivi mavjud, lekin ketma-ketlashtirish uchun biz uning ichki ob'ektlari ustida takrorlashimiz shart emas. Interfeys Seriliazable
buni avtomatik ravishda hal qiladi. Listing 2. Faylga chiqarish uchun obyektlarni ketma-ketlashtirishning oddiy misoli
import java.io.*;
import java.util.*;
public class OutSerialize {
public static void main (String args[]) throws IOException {
RandomClass rc1 = new RandomClass();
RandomClass rc2 = new RandomClass();
//создание цепи потоков с потоком вывода an object в конце
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("objects.dat"));
Date now = new Date(System.currentTimeMillis());
//java.util.* был импортирован для использования класса Date
out.writeObject(now);
out.writeObject(rc1);
out.writeObject(rc2);
out.close();
System.out.println("I have written:");
System.out.println("A Date object: "+now);
System.out.println("Two Group of randoms");
rc1.printout();
rc2.printout();
}
}
ObjectInputStream
Quyidagi kod tashqi fayldan dasturga ketma-ketlashtirilgan ma'lumotlarni o'qiydigan sinfning imkoniyatlarini ko'rsatadi . E'tibor bering, ob'ektlar faylga yozilgan tartibda o'qiladi. Listing 3. Seriyalashtirilgan ob'ektlarni o'qish yoki Seriyadan chiqarish
import java.io.*;
import java.util.*;
public class InSerialize {
public static void main (String args[]) throws IOException, ClassNotFoundException {
ObjectInputStream in = new ObjectInputStream (new FileInputStream("objects.dat"));
Date d1 = (Date)in.readObject();
RandomClass rc1 = (RandomClass)in.readObject();
RandomClass rc2 = (RandomClass)in.readObject();
System.out.println("I have read:");
System.out.println("A Date object: "+d1);
System.out.println("Two Group of randoms");
rc1.printout();
rc2.printout();
}
}
Deyarli barcha Java sinflari, shu jumladan AWT sinflari seriyali bo'lishi mumkin. Oyna bo'lgan ramka grafik komponentlar to'plamini o'z ichiga oladi. Agar kadr ketma-ketlashtirilgan bo'lsa, serializatsiya mexanizmi bu haqda g'amxo'rlik qiladi va uning barcha komponentlari va ma'lumotlarini (joylashuvi, mazmuni va boshqalar) ketma-ketlashtiradi. Ba'zi Java sinf ob'ektlarini ketma-ketlashtirib bo'lmaydi, chunki ular vaqtinchalik operatsion tizim resurslariga havola qilingan ma'lumotlarni o'z ichiga oladi. Masalan, sinflar java.io.FileInputStream
va java.lang.Thread
. Agar ob'ekt ketma-ketlashtirilmagan elementlarga havolalarni o'z ichiga olsa, butun ketma-ketlashtirish jarayoni muvaffaqiyatsiz bo'ladi va istisno qilinadi NotSerializableException
. Agar biron-bir ob'ekt ketma-ketlashtirilmagan ob'ektning havolasiga tegishli bo'lsa, uni transient kalit so'zi yordamida seriyalash mumkin . Listing 4. Transient kalit so'zidan foydalanib ketma-ketlashtiriladigan ob'ektlarni yaratish
public class Sclass implements Serializable{
public transient Thread newThread;
//помните, что поток(поток параллельного исполнения) по умолчанию не сериализуемый класс
private String studentID;
private int sum;
}
Seriyalashtirishda xavfsizlik
Java-da sinfni ketma-ketlashtirish uning barcha ma'lumotlarini oqim orqali tashqi fayl yoki ma'lumotlar bazasiga o'tkazishni o'z ichiga oladi. Biz xohlagan vaqtda ketma-ketlashtiriladigan ma'lumotlarni cheklashimiz mumkin. Buning uchun ikkita usul mavjud:- Vaqtinchalik deb e'lon qilingan har bir sinf parametri ketma-ketlashtirilmaydi (sukut bo'yicha, barcha sinf parametrlari ketma-ketlashtiriladi)
- Yoki biz ketma-ketlashtirmoqchi bo'lgan sinfning har bir parametri teg bilan belgilanadi
Externalizable
(sukut bo'yicha, hech qanday parametr seriyalashtirilmaydi).
ObjectOutputStream
belgilangan bo'lsa, ob'ektga chaqirilganda ma'lumotlar maydoni seriyalashtirilmaydi . Masalan: . Boshqa tomondan, ob'ekt ma'lumotlarini seriyali deb e'lon qilish uchun biz sinfni ushbu ob'ekt ma'lumotlarini aniq yozish va o'qish deb belgilashimiz kerak.private transient String password
ExternalizablewriteExternal
readExteranl
Xulosa
Ob'ektni ketma-ketlashtirish xususiyati ko'plab taqsimlangan tizimlarda ma'lumotlarni uzatish usuli sifatida qo'llaniladi. Ammo ketma-ketlashtirish yashirin tafsilotlarni ochib beradi, shu bilan mavhum ma'lumotlar turlarining haqiqiyligini yo'q qiladi, bu esa o'z navbatida inkapsulyatsiyani buzadi. Shu bilan birga, ketma-ketlashtirilgan ob'ektning ma'lumotlari asl, asl ob'ektda bo'lgan bir xil ma'lumotlar ekanligini bilish yoqimli. Bu, shuningdek, interfeysni amalga oshirish va bir necha qator kod ishlatilsa ham,ObjectInputValidation
usulni bekor qilish uchun ajoyib imkoniyatdir. validateObject()
Agar ob'ekt topilmasa, biz mos ravishda istisno qilishimiz mumkin InvalidObjectException
. Asl maqola: Java-da serializatsiya qanday ishlaydi
GO TO FULL VERSION