JavaRush /Java blogi /Random-UZ /Serializatsiya Java-da qanday ishlaydi
ramhead
Daraja

Serializatsiya Java-da qanday ishlaydi

Guruhda nashr etilgan
Ushbu maqolada biz serializatsiya nima ekanligini va Java-da qanday ishlashini tushuntiramiz. Java-da serializatsiya qanday ishlaydi - 1

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. ObjectInputStreamBu asosan va sinflar tufayli avtomatik ravishda sodir bo'ladi ObjectOutputStream. Dasturchi Serializablesinfni 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 JFrameturidan 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.
Serializatsiya kontseptsiyasini to'liq tushunish uchun siz boshqa ikkita tushunchani aniq tushunishingiz kerak - ob'ekt qat'iyligi va ipning doimiyligi. Bu erda eslab qolish uchun ularning har biri haqida bir oz gaplashamiz. Ularning to'liq izohi ushbu tushunchalarning har biri uchun alohida bobni talab qiladi.

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 . Java-da serializatsiya qanday ishlaydi - 2
Shakl 1. Threadsning grafik tasviri
Oqimlar asosan ikki turga bo'linadi:
  • *Oqimlar deb nomlangan bayt oqim sinflari
  • *Reader va *Writer deb nomlangan belgilar oqimi sinflari
Har bir ma'lumot yozish oqimi yozish usullari to'plamini o'z ichiga oladi. Va har bir ma'lumotni o'qish mavzusi, shunga ko'ra, o'xshash o'qish usullari to'plamiga ega. Ip yaratilgandan so'ng, ushbu usullarning barchasi chaqirilishi kerak.

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.SerializableHar qanday sinf ushbu sinf ob'ektlarini ketma-ketlashtirish uchun interfeysni amalga oshirishi kerak . Interfeysda Serializableusullar 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
Listing 1. Serializatsiyani ko'rsatish uchun oddiy sinfga misol
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 Seriliazablebuni 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();
 }
}
ObjectInputStreamQuyidagi 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.FileInputStreamva 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).
Agar ob'ektning ma'lumotlar maydoni vaqtinchalik debObjectOutputStream 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 passwordExternalizablewriteExternalreadExteranl

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, ObjectInputValidationusulni bekor qilish uchun ajoyib imkoniyatdir. validateObject()Agar ob'ekt topilmasa, biz mos ravishda istisno qilishimiz mumkin InvalidObjectException. Asl maqola: Java-da serializatsiya qanday ishlaydi
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION