JavaRush /Java Blogu /Random-AZ /Java-da seriallaşdırma necə işləyir
ramhead
Səviyyə

Java-da seriallaşdırma necə işləyir

Qrupda dərc edilmişdir
Bu yazıda seriallaşdırmanın nə olduğunu və Java-da necə işlədiyini izah edəcəyik. Java-da seriallaşdırma necə işləyir - 1

Giriş

Obyektin serializasiyası obyektin özünün və istinad etdiyi hər hansı digər obyektlərin çıxış axınından (məsələn, xarici fayla) tam surətini saxlamaq qabiliyyətidir. Bu yolla obyekt bir az sonra lazım olduqda seriallaşdırılmış (saxlanılan) nüsxədən yenidən yaradıla bilər. JDK 1.1-də təqdim edilən yeni xüsusiyyət olan obyekt serializasiyası şəbəkə üzərində saxlama və ya ötürmə üçün qrupları və ya fərdi obyektləri bit axınına və ya bayt massivinə çevirmək funksiyasını təmin edir. Və qeyd edildiyi kimi, verilmiş bit axını və ya bayt massivi yenidən Java obyektlərinə çevrilə bilər. ObjectInputStreamBu, əsasən və sinifləri sayəsində avtomatik olaraq baş verir ObjectOutputStream. Proqramçı Serializablesinif yaratarkən interfeysi həyata keçirməklə bu funksiyanı həyata keçirməyə qərar verə bilər. Serializasiya prosesi obyektin sıralanması , sıradan çıxarılması isə unmarshaling kimi tanınır . Serializasiya, obyektə özünün və obyekt tərəfindən istinad edilən bütün digər obyektlərin surətini istifadə edərək xarici faylda saxlamağa imkan verən mexanizmdir ObjectOutputStream. Saxlanılan obyektlər məlumat strukturları, diaqramlar, sinif obyektləri JFramevə ya növündən asılı olmayaraq hər hansı digər obyektlər ola bilər. Eyni zamanda, seriallaşdırma obyektin hansı tip olması haqqında məlumatları saxlayır ki, sonradan seriyadan çıxarıldıqda həmin məlumat onun dəqiq obyekt tipini yenidən yaratmaq üçün istifadə olunsun. Beləliklə, seriallaşdırma aşağıdakı imkanları təmin edir:
  • Obyektlərin saxlanması sistemi, yəni: xassələrinin xarici faylda, diskdə və ya verilənlər bazasında saxlanması.
  • Uzaqdan prosedur çağırış sistemi.
  • Obyekt paylama sistemi, məsələn, COM, COBRA kimi proqram komponentlərində.
  • Zamanla dəyişən məlumatlarda dəyişiklikləri müəyyən etmək üçün sistem.
Serializasiya anlayışını tam başa düşmək üçün siz digər iki anlayışı – obyekt davamlılığı və iplik davamlılığı haqqında aydın başa düşməlisiniz. Burada yadda saxlamaq üçün onların hər biri haqqında bir az danışacağıq. Onların tam izahı bu anlayışların hər biri üçün ayrıca fəsil tələb edərdi.

Axınlar:

Hər bir proqram öz məlumatını saxlama yerinə və ya boruya yazmalıdır və hər bir proqram bir boru və ya saxlama yerindən məlumatları oxumalıdır. Java-da proqramların yazıldığı və məlumatların oxunduğu bu kanallara Streams ( Stream) deyilir . Java-da seriallaşdırma necə işləyir - 2
Şəkil 1. Mövzuların qrafik təsviri
Axınlar əsasən iki növə bölünür:
  • *Axınlar adlanan bayt axın sinifləri
  • *Reader və *Writer adlı xarakter axını sinifləri
Hər bir məlumat yazma axını bir sıra yazma metodlarını ehtiva edir. Və hər bir məlumat oxu mövzusu, müvafiq olaraq, oxşar oxu üsulları dəstinə malikdir. Mövzu yaradıldıqdan sonra bütün bu üsullar çağırılmalıdır.

Əzmkarlıq

Obyektin davamlılığı bir obyektin yaşamaq və ya başqa sözlə, proqramın icrası zamanı “sağ qalmaq” qabiliyyətidir. Bu o deməkdir ki, iş vaxtında yaradılmış hər hansı obyekt JVM zibilləyicisi tərəfindən həmin obyekt artıq istifadə edilmədikdə məhv edilir. Lakin davamlı API tətbiq olunarsa, bu obyektlər JVM zibilləyicisi tərəfindən məhv edilməyəcək, əvəzində onlara "yaşamağa" icazə veriləcək, bu da proqram növbəti dəfə işə salındıqda onlara daxil olmağa imkan verir. Başqa sözlə, əzmkarlıq o deməkdir ki, işləyən tətbiqin istifadə müddətindən asılı olmayaraq obyekt üçün bir ömür var. Davamlılığı həyata keçirməyin yollarından biri obyektləri hardasa xarici fayl və ya verilənlər bazasında saxlamaq və sonra həmin faylları və ya verilənlər bazasını mənbə kimi istifadə edərək onları bərpa etməkdir. Serializasiyanın işə girdiyi yer budur. JVM işlədiyi müddətdə hər hansı qeyri-davamlı obyekt mövcuddur. Seriallaşdırılmış obyektlər sadəcə olaraq axınlara çevrilən obyektlərdir, daha sonra onlar xarici faylda saxlanılır və ya saxlama və bərpa üçün şəbəkə üzərindən ötürülür.

Seriallaşdırıla bilən interfeysin həyata keçirilməsi

java.io.Serializableİstənilən sinif həmin sinfin obyektlərini seriallaşdırmaq üçün interfeys tətbiq etməlidir . İnterfeys Serializableheç bir metoda malik deyil və yalnız sinfi qeyd edir ki, onu seriallaşdırıla bilən kimi müəyyən etmək mümkün olsun. Yalnız seriallaşdırılmış sinif obyektinin sahələri saxlanıla bilər. Metodlar və ya konstruktorlar seriallaşdırılmış axının bir hissəsi kimi saxlanmır. Əgər hər hansı obyekt başqa obyektə istinad kimi çıxış edirsə, o zaman həmin obyektin sinifi interfeysi həyata keçirirsə, o obyektin sahələri də seriallaşdırılır Serializable. Başqa sözlə, bu şəkildə əldə edilən bu obyektin qrafiki tamamilə seriallaşdırıla bilər. Obyekt qrafiki ağac və ya obyektin sahələrinin strukturunu və onun alt obyektlərini ehtiva edir. İnterfeys həyata keçirməyə kömək edən iki əsas sinif Seriliazable:
  • ObjectInputStream
  • ObjectOutputStream
Siyahı 1. Serializasiyanı göstərmək üçün sadə sinif nümunəsi
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();
    }
}
Yuxarıdakı kodda seriallaşdırıla bilən sinif yaradılır, çünki serializasiya interfeysi ilə "işarələnmiş". Sinif onun nümunəsi yaradıldıqda təsadüfi tam ədədlər massivi yaradır. Aşağıdakı kod istifadə edərək axına obyektlər yazmaq qabiliyyətini göstərir ObjectOutputStream. Proqramda tam ədədlər massivi var, lakin seriallaşdırma üçün onun daxili obyektləri üzərində təkrarlamamız lazım deyil. İnterfeys Seriliazablebununla avtomatik olaraq məşğul olur. Siyahı 2. Fayla çıxış üçün obyektlərin seriallaşdırılmasının sadə nümunəsi
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();
 }
}
ObjectInputStreamAşağıdakı kod , xarici fayldan proqrama seriallaşdırılmış məlumatları oxuyan sinifin imkanlarını nümayiş etdirir . Nəzərə alın ki, obyektlər fayla yazıldıqları ardıcıllıqla oxunur. Siyahı 3. Seriallaşdırılmış obyektlərin oxunması və ya Seriyadan çıxarılması
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();
 }
}
Demək olar ki, bütün Java sinifləri, o cümlədən AWT sinifləri seriallaşdırıla bilər. Pəncərə olan çərçivə bir sıra qrafik komponentləri ehtiva edir. Çərçivə seriallaşdırılıbsa, seriallaşdırma mühərriki bununla məşğul olur və onun bütün komponentlərini və məlumatlarını (mövqe, məzmun və s.) seriallaşdırır. Bəzi Java sinif obyektləri seriallaşdırıla bilməz, çünki onlar efemer əməliyyat sistemi resurslarına istinad edən məlumatları ehtiva edir. Məsələn, siniflər java.io.FileInputStreamjava.lang.Thread. Obyektdə seriallaşdırıla bilməyən elementlərə istinadlar varsa, bütün seriallaşdırma əməliyyatı uğursuz olacaq və istisna atılacaq NotSerializableException. Əgər hər hansı obyekt seriallaşdırılmamış obyektin istinadına istinad edirsə, o zaman keçid açar sözündən istifadə etməklə seriallaşdırıla bilər . Siyahı 4. Keçid açar sözündən istifadə edərək seriallaşdırıla bilən obyektlərin yaradılması
public class Sclass implements Serializable{
public transient Thread newThread;
//помните, что поток(поток параллельного исполнения) по умолчанию не сериализуемый класс
    private String studentID;
    private int sum;
}

Serializasiyada təhlükəsizlik

Java-da bir sinfin seriyalaşdırılması onun bütün məlumatlarının axın vasitəsilə xarici fayla və ya verilənlər bazasına ötürülməsini nəzərdə tutur. İstədiyimiz zaman seriallaşdırılacaq məlumatları məhdudlaşdıra bilərik. Bunu etməyin iki yolu var:
  • Keçici kimi elan edilən hər bir sinif parametri seriallaşdırılmır (defolt olaraq, bütün sinif parametrləri seriallaşdırılır)
  • Və ya seriallaşdırmaq istədiyimiz sinfin hər bir parametri etiketlə qeyd olunur Externalizable(standart olaraq heç bir parametr seriallaşdırılmır).
Obyektin məlumat sahəsi keçici olaraqObjectOutputStream işarələnibsə, məlumat sahəsi obyektə çağırıldıqda ilə seriallaşdırılmayacaq . Misal üçün: . Digər tərəfdən, obyektin məlumatlarını açıq şəkildə seriallaşdırıla bilən elan etmək üçün sinfi həmin obyektin məlumatlarını açıq şəkildə yazan və oxuyan kimi qeyd etməliyik.private transient String passwordExternalizablewriteExternalreadExteranl

Nəticə

Obyektin seriallaşdırılması xüsusiyyəti bir çox paylanmış sistemlərdə məlumatların ötürülməsi üsulu kimi istifadə olunur. Lakin seriallaşdırma gizli təfərrüatları üzə çıxarır, beləliklə, mücərrəd məlumat növlərinin həqiqiliyini məhv edir, bu da öz növbəsində inkapsulyasiyanı məhv edir. Eyni zamanda, seriallaşdırılmış obyektin məlumatlarının orijinal, orijinal obyektdə olan eyni məlumat olduğunu bilmək xoşdur. Bu, həmçinin bir neçə kod sətirindən istifadə olunsa belə, interfeysi həyata keçirmək ObjectInputValidationvə metodu ləğv etmək üçün əla fürsətdir. validateObject()Obyekt tapılmırsa, müvafiq qaydada bir istisna ata bilərik InvalidObjectException. Orijinal məqalə: Java-da seriallaşdırma necə işləyir
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION