JavaRush /Java блогы /Random-KK /Java тілінде сериялау қалай жұмыс істейді
ramhead
Деңгей

Java тілінде сериялау қалай жұмыс істейді

Топта жарияланған
Бұл мақалада біз сериализация дегеніміз не және ол Java-да қалай жұмыс істейтінін түсіндіреміз. Java тілінде сериализация қалай жұмыс істейді - 1

Кіріспе

Нысанды сериялау - бұл нысанның шығыс ағынын (мысалы, сыртқы файлға) пайдаланып өзінің және сілтеме жасайтын кез келген басқа нысандардың толық көшірмесін сақтау мүмкіндігі. Осылайша, an objectіні қажет болғанда серияланған (сақталған) көшірмеден сәл кейінірек қайта жасауға болады. JDK 1.1 жүйесінде енгізілген жаңа мүмкіндік нысанды сериялау желі арқылы сақтау немесе тасымалдау үшін топтарды немесе жеке нысандарды биттік ағынға немесе byte массивіне түрлендіру функциясын қамтамасыз етеді. Және айтылғандай, берілген биттік ағын немесе byte массивін Java нысандарына қайта түрлендіруге болады. ObjectInputStreamБұл негізінен және сыныптардың арқасында автоматты түрде орын алады ObjectOutputStream. Бағдарламашы бұл функцияны Serializableсыныпты құру кезінде интерфейсті енгізу арқылы жүзеге асыруды шеше алады. Сериализация процесі an objectілерді ретке келтіру ретінде де белгілі, ал сериядан шығару unmarshaling ретінде белгілі . Серияландыру - бұл нысанға өзінің көшірмесін және осы нысан сілтеме жасаған барлық басқа нысандарды сыртқы файлға сақтау мүмкіндігін беретін механизм ObjectOutputStream. JFrameСақталған нысандар деректер құрылымдары, диаграммалар, сынып an objectілері немесе түріне қарамастан кез келген басқа нысандар болуы мүмкін . Сонымен қатар, сериялау нысанның қандай түрі туралы ақпаратты сақтайды, осылайша кейінірек сериядан шығарылған кезде бұл ақпарат нысанның нақты түрін қайта жасау үшін пайдаланылады. Сонымен, сериялау келесі мүмкіндіктерді қамтамасыз етеді:
  • Объектілерді сақтауға арналған жүйе, яғни: олардың қасиеттерін сыртқы файлға, дискіге немесе дерекқорға сақтау.
  • Қашықтан proceduresаны шақыру жүйесі.
  • Объектіні тарату жүйесі, мысалы, COM, COBRA сияқты бағдарламалық қамтамасыз ету компоненттерінде.
  • Уақыт бойынша айнымалы деректердегі өзгерістерді анықтау жүйесі.
Сериализация тұжырымдамасын толық түсіну үшін сіз басқа екі ұғымды нақты түсінуіңіз керек — нысан тұрақтылығы және ағынның тұрақтылығы. Мұнда біз есте сақтау үшін олардың әрқайсысы туралы аздап айтамыз. Олардың толық түсіндірмесі осы ұғымдардың әрқайсысы үшін жеке тарауды қажет етеді.

Ағындар:

Әрбір бағдарлама өз деректерін сақтау орнына немесе құбырға жазуы керек және әрбір бағдарлама деректерді құбырдан немесе сақтау орнынан оқуы керек. Java тілінде бағдарламалар жазылатын және олардан деректерді оқитын арналар Ағындар ( Stream) деп аталады . Java-да сериялау қалай жұмыс істейді - 2
Сурет 1. Жіптердің графикалық көрінісі
Ағындар негізінен екі түрге бөлінеді:
  • *Ағындар деп аталатын byte ағыны кластары
  • *Reader және *Writer деп аталатын таңбалар ағыны кластары
Әрбір деректерді жазу ағыны жазу әдістерінің жиынын қамтиды. Және әрбір деректерді оқу ағыны сәйкесінше оқу әдістерінің ұқсас жиынтығына ие. Жіп жасалғаннан кейін осы әдістердің барлығын шақыру керек.

Табандылық

Объектінің тұрақтылығы - бұл an objectінің өмір сүру қабілеті немесе басқаша айтқанда, бағдарламаны орындау кезінде «тірі қалу». Бұл орындалу уақытында жасалған кез келген нысанды JVM қоқыс құрылғысы бұл нысан бұдан былай пайдаланылмаған кезде жойылатынын білдіреді. Бірақ егер тұрақты API іске асырылса, бұл нысандар JVM қоқыс өңдеушісі арқылы жойылмайды, оның орнына оларға «өмір сүруге» рұқсат беріледі, бұл сонымен қатар қолданба келесі рет іске қосылғанда оларға қол жеткізуге мүмкіндік береді. Басқаша айтқанда, тұрақтылық іске қосылған қолданбаның қызмет ету мерзімінен тәуелсіз нысан үшін қызмет ету мерзімі бар екенін білдіреді. Табандылықты жүзеге асырудың бір жолы нысандарды сыртқы файлдың немесе дерекқордың бір жерінде сақтау, содан кейін сол файлдарды немесе дерекқорды көздер ретінде пайдалану арқылы оларды кейінірек қалпына келтіру болып табылады. Бұл жерде сериализация ойнайды. Кез келген тұрақты емес нысан JVM жұмыс істеп тұрғанда бар. Сериалданған нысандар - жай ғана ағындарға түрлендірілетін нысандар, олар кейін сыртқы файлға сақталады немесе сақтау және қалпына келтіру үшін желі арқылы тасымалданады.

Серияланатын интерфейсті жүзеге асыру

java.io.SerializableКез келген сынып осы сыныптың нысандарын сериялау үшін интерфейсті жүзеге асыруы керек . Интерфейстің Serializableәдістері жоқ және тек сериялық ретінде анықтауға болатын сыныпты белгілейді. Тек серияланған сынып нысанының өрістерін сақтауға болады. Әдістер немесе конструкторлар серияланған ағынның бөлігі ретінде сақталмайды. Егер кез келген нысан басқа нысанға сілтеме ретінде әрекет етсе, сол нысанның класы интерфейсті жүзеге асырса, сол нысанның өрістері де серияланады Serializable. Басқаша айтқанда, осылайша алынған бұл нысанның графигі толығымен сериялануға болады. Нысан графигі ағашты немесе нысанның өрістерінің құрылымын және оның ішкі an objectілерін қамтиды. Интерфейсті іске асыруға көмектесетін екі негізгі класс Seriliazable:
  • ObjectInputStream
  • ObjectOutputStream
Листинг 1. Серияландыруды көрсету үшін қарапайым класс мысалы
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();
    }
}
Жоғарыдағы codeта серияланатын класс жасалады, себебі сериялау интерфейсімен «белгіленген». Класс оның данасы жасалған кезде кездейсоқ бүтін сандар массивін жасайды. Төмендегі code арқылы ағынға нысандарды жазу мүмкіндігі көрсетілген ObjectOutputStream. Бағдарламада бүтін сандар массиві бар, бірақ сериялау үшін оның ішкі нысандарын қайталаудың қажеті жоқ. Интерфейс Seriliazableмұны автоматты түрде орындайды. Листинг 2. Файлға шығару үшін an objectілерді сериялаудың қарапайым мысалы
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Төмендегі code сериялық деректерді сыртқы файлдан бағдарламаға оқитын сыныптың мүмкіндіктерін көрсетеді . Нысандардың файлға жазылған ретімен оқылатынын ескеріңіз. Листинг 3. Серияланған нысандарды оқу немесе сериядан шығару
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();
 }
}
Барлық дерлік Java сыныптарын, соның ішінде AWT сыныптарын сериялауға болады. Терезе болып табылатын фрейм графикалық компоненттер жиынын қамтиды. Егер кадр серияланса, сериялау механизмі бұл туралы қамқорлық жасайды және оның барлық құрамдастары мен деректерін (орын, мазмұн, т.б.) сериялайды. Кейбір Java сынып нысандарын сериялау мүмкін емес, себебі оларда эфемерлі операциялық жүйе ресурстарына сілтеме жасайтын деректер бар. Мысалы, сыныптар java.io.FileInputStreamжәне java.lang.Thread. Егер нысанда серияланbyteын элементтерге сілтемелер болса, бүкіл сериялау әрекеті сәтсіз болады және ерекше жағдай шығарылады NotSerializableException. Кез келген нысан серияланбаған нысанның сілтемесіне сілтеме жасаса, оны уақытша кілт сөзі арқылы сериялауға болады . Листинг 4. Өтпелі кілт сөзі арқылы серияланатын нысандарды жасау
public class Sclass implements Serializable{
public transient Thread newThread;
//помните, что поток(поток параллельного исполнения) по умолчанию не сериализуемый класс
    private String studentID;
    private int sum;
}

Серияландырудағы қауіпсіздік

Java тілінде сыныпты сериялау оның барлық деректерін сыртқы файлға немесе дерекқорға ағын арқылы беруді қамтиды. Біз кез келген уақытта серияланатын деректерді шектей аламыз. Мұны істеудің екі жолы бар:
  • Өтпелі деп жарияланған әрбір сынып параметрі серияланбайды (әдепкі бойынша, барлық сынып параметрлері серияланады)
  • Немесе біз сериялайтын сыныптың әрбір параметрі тегпен белгіленеді Externalizable(әдепкі бойынша ешбір параметр серияланбайды).
ObjectOutputStreamДеректер өрісі нысанға шақырылған кезде, егер бұл нысанның деректер өрісі өтпелі деп белгіленген болса , серияланбайды . Мысалы: private transient String password. Екінші жағынан, нысанның деректерін сериялануға болатын деп анық жариялау үшін біз сыныпты осы нысанның деректерін ExternalizablewriteExternalнақты жазатын және оқитын деп белгілеуіміз керек.readExteranl

Қорытынды

Объектіні сериялау мүмкіндігі көптеген таратылған жүйелерде деректерді тасымалдау тәсілі ретінде қолданылады. Бірақ сериялау жасырын мәліметтерді ашады, осылайша дерексіз деректер түрлерінің түпнұсқалығын бұзады, бұл өз кезегінде инкапсуляцияны бұзады. Сонымен қатар, серияланған нысанның деректері бастапқы, бастапқы нысандағы деректермен бірдей екенін білу жақсы. Бұл сонымен қатар codeтың бірнеше жолы пайдаланылса да, интерфейсті енгізу ObjectInputValidationжәне әдісті қайта анықтаудың тамаша мүмкіндігі. validateObject()Егер нысан табылмаса, біз сәйкесінше ерекше жағдайды жасай аламыз InvalidObjectException. Түпнұсқа мақала: Java тілінде сериялау қалай жұмыс істейді
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION