JavaRush /Блоги Java /Random-TG /Чӣ тавр Serialization дар Java кор мекунад
ramhead
Сатҳи

Чӣ тавр Serialization дар Java кор мекунад

Дар гурӯҳ нашр шудааст
Дар ин мақола мо мефаҳмонем, ки сериализатсия чист ва он дар Java чӣ гуна кор мекунад. Чӣ тавр сериализатсия дар Java кор мекунад - 1

Муқаддима

Сериализатсияи an object ин қобorяти an object барои нигоҳ доштани нусхаи пурраи худ ва ҳама an objectҳои дигаре, ки бо истифода аз ҷараёни баромад (масалан, ба файли беруна) муроҷиат мекунад, мебошад. Ҳамин тариқ, an objectро метавон аз нусхаи сериализатсияшуда (захирашуда) каме дертар ҳангоми зарурат дубора эҷод кард. Сериализатсияи an object, хусусияти наве, ки дар JDK 1.1 ҷорӣ шудааст, функсияро барои табдил додани гурӯҳҳо ё an objectҳои инфиродӣ ба массиви бит ё массиви byteӣ барои нигоҳдорӣ ё интиқол тавассути шабака таъмин мекунад. Ва тавре ки гуфта шуд, ҷараёни бит ё массиви byteро метавон дубора ба an objectҳои Java табдил дод. Ин асосан ба таври худкор ба шарофати ObjectInputStreamва дарсҳо рӯй медиҳад ObjectOutputStream. Барномасоз метавонад қарор кунад, ки ин функсияро тавассути татбиқи интерфейс Serializableҳангоми сохтани синф амалӣ кунад. Раванди сериализатсия инчунин ҳамчун маршалинги an object маълум аст, дар ҳоле ки сериализатсия ҳамчун маршализатсия маълум аст . Сериализатсия як механизмест, ки ба an object имкон медиҳад, ки нусхаи худ ва ҳама an objectҳои дигареро, ки ин an object ба файли беруна истинод кардааст, бо истифода аз ObjectOutputStream. Объектҳои захирашуда метавонанд сохторҳои додаҳо, диаграммаҳо, an objectҳои синфӣ JFrameё ҳама an objectҳои дигар, новобаста аз намуди онҳо бошанд. Ҳамзамон, сериализатсия маълумотро дар бораи кадом навъи an object нигоҳ медорад, то баъдтар, ҳангоми бекоркунӣ, ин маълумот барои аз нав сохтани навъи дақиқи an objectи он истифода шавад. Ҳамин тариқ, сериализатсия имкониятҳои зеринро фароҳам меорад:
  • Система барои нигоҳдории an objectҳо, яъне: захира кардани хосиятҳои онҳо ба файли беруна, ба диск ё пойгоҳи додаҳо.
  • Системаи занги расмиёти дурдаст.
  • Системаи тақсимоти an object, масалан, дар ҷузъҳои нармафзор ба монанди COM, COBRA.
  • Система барои муайян кардани тағирот дар маълумоти тағирёбанда бо мурури замон.
Барои пурра фаҳмидани консепсияи сериализатсия, шумо бояд фаҳмиши дақиқи ду мафҳуми дигар дошта бошед - устувории an object ва устувории ришта. Дар ин ҷо мо дар бораи ҳар яки онҳо каме сӯҳбат мекунем, то дар хотир нигоҳ дорем. Шарҳи пурраи онҳо барои ҳар яке аз ин мафҳумҳо боби алоҳида лозим аст.

Ҷараёнҳо:

Ҳар як барнома бояд маълумоти худро ба макони нигаҳдорӣ ё қубур нависад ва ҳар як барнома бояд маълумотро аз қубур ё макони нигаҳдорӣ бихонад. Дар Java, ин каналҳое, ки барномаҳо ба онҳо менависанд ва аз он барномаҳо маълумот мехонанд, Streams ( Stream) номида мешаванд . Чӣ тавр силсиласозӣ дар Java кор мекунад - 2
Расми 1. Намоиши графикии риштаҳо
Ҷараёнҳо асосан ба ду намуд тақсим мешаванд:
  • Синфҳои ҷараёнҳои byteӣ бо номи *Ҷараёнҳо
  • Синфҳои ҷараёнҳои аломатҳо бо номи *Reader ва *Writer
Ҳар як ҷараёни навиштани маълумот маҷмӯи усулҳои навиштанро дар бар мегирад. Ва ҳар як риштаи хондани маълумот, мувофиқан, маҷмӯи шабеҳи усулҳои хониш дорад. Пас аз сохтани ришта, ҳамаи ин усулҳо бояд даъват карда шаванд.

Устуворӣ

Устувории an object ин қобorяти зинда мондани an object ё ба ибораи дигар, ҳангоми иҷрои барнома "зинда мондан" мебошад. Ин маънои онро дорад, ки ҳама an objectе, ки дар вақти корӣ сохта шудааст, аз ҷониби scavenger JVM нобуд карда мешавад, вақте ки ин an object дигар истифода намешавад. Аммо агар API-и доимӣ амалӣ карда шавад, ин an objectҳо аз ҷониби scavenger JVM нест карда намешаванд, ба ҷои онҳо ба "зиндагӣ" иҷозат дода мешавад, ки ин инчунин имкон медиҳад, ки дафъаи оянда ба кор андохтани барнома дастрасӣ пайдо кунанд. Ба ибораи дигар, суботкорӣ маънои онро дорад, ки барои an object, новобаста аз умри замимаи иҷрошаванда як умр вуҷуд дорад. Як роҳи татбиқи устуворӣ нигоҳ доштани an objectҳо дар ягон файл ё пойгоҳи додаҳои беруна ва сипас барқарор кардани онҳо дар вақти баъдӣ бо истифода аз ин файлҳо ё пойгоҳи додаҳо ҳамчун манбаъ мебошад. Дар ин ҷо сериализатсия ба бозӣ меояд. Ҳар як an objectи доимӣ то он даме, ки JVM кор мекунад, вуҷуд дорад. Объектҳои силсилавӣ танҳо an objectҳое мебошанд, ки ба ҷараёнҳо табдил меёбанд, ки баъдан ба файли беруна захира карда мешаванд ё тавассути шабака барои нигоҳдорӣ ва барқарорсозӣ интиқол дода мешаванд.

Амалисозии интерфейси Serializable

Ҳар як синф бояд интерфейсро java.io.Serializableбарои силсилаи an objectҳои он синф амалӣ кунад. Интерфейс Serializableҳеҷ гуна усул надорад ва танҳо синфро қайд мекунад, то он ҳамчун сериализатсияшаванда муайян карда шавад. Танҳо майдонҳои an objectи синфи силсилавӣ захира карда мешаванд. Усулҳо ё созандагон ҳамчун як қисми ҷараёни силсилавӣ нигоҳ дошта намешаванд. Агар ягон an object ҳамчун истинод ба an objectи дигар амал кунад, майдонҳои он an object низ силсилаи карда мешаванд, агар синфи он an object интерфейсро амалӣ кунад Serializable. Ба ибораи дигар, графики ин an objectи бо ин роҳ ба даст овардашуда комилан сериализатсияшаванда аст. Графикаи an object дорои дарахт ё сохтори майдонҳои an object ва зерan objectҳои он мебошад. Ду синфи асосӣ, ки ба татбиқи интерфейс кӯмак мекунанд Seriliazable:
  • ObjectInputStream
  • ObjectOutputStream
Рӯйхати 1. Намунаи як синфи оддӣ нишон serialization
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и боло синфе сохта шудааст, ки сериализатсияшаванда аст, зеро бо интерфейси сериализатсия "нишона шудааст". Синф массиви ададҳои тасодуфиро ҳангоми сохтани як мисоли он эҷод мекунад. Рамзи зер қобorяти навиштани an objectҳо ба ҷараёнро бо истифода аз ObjectOutputStream. Барнома як қатор ададҳои бутун дорад, аммо барои силсиласозӣ ба мо лозим нест, ки an objectҳои дохorи онро такрор кунем. Интерфейс 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();
 }
}
Рамзи дар поён овардашуда қобorятҳои синфро нишон медиҳад ObjectInputStream, ки маълумоти силсилаишударо аз файли беруна ба барнома мехонад. Дар хотир доред, ки an objectҳо бо ҳамон тартибе, ки онҳо ба файл навишта шуда буданд, хонда мешаванд. Рӯйхат 3. Хониши an objectҳои силсилавӣ ё Deserializing
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-ро метавон силсилавӣ кард. Чаҳорчӯба, ки тиреза аст, маҷмӯи ҷузъҳои графикиро дар бар мегирад. Агар чаҳорчӯба сериализатсия карда шавад, муҳаррики сериализатсия дар ин бора ғамхорӣ мекунад ва ҳамаи ҷузъҳо ва маълумоти онро (мавқеъ, мундариҷа ва ғ.) сериал мекунад. Баъзе an objectҳои синфи Java наметавонанд сериализатсия шаванд, зеро онҳо дорои маълумоте мебошанд, ки ба захираҳои системаи оператсионии эфемерӣ муроҷиат мекунанд. Масалан, синфҳо java.io.FileInputStreamва java.lang.Thread. Агар an object дорои истинодҳо ба унсурҳои сериализатсиянашаванда бошад, тамоми амалиёти сериализатсия ноком мешавад ва истисно партофта мешавад NotSerializableException. Агар ягон an object ба истинод ба an objectи сериянашуда ишора кунад, пас он метавонад бо истифода аз калимаи калидии transient сериализатсия карда шавад . Рӯйхат 4. Эҷоди an objectҳои serializable бо истифода аз калимаи transient
public class Sclass implements Serializable{
public transient Thread newThread;
//помните, что поток(поток параллельного исполнения) по умолчанию не сериализуемый класс
    private String studentID;
    private int sum;
}

Амният дар силсиласозӣ

Сериализатсияи синф дар Java интиқоли тамоми маълумоти онро ба файл ё пойгоҳи додаҳои беруна тавассути ҷараён дар бар мегирад. Мо метавонем маълумотеро, ки сериализатсия карда мешаванд, вақте ки мо хоҳем, маҳдуд карда метавонем. Ду роҳи ин кор вуҷуд дорад:
  • Ҳар як параметри синфе, ки ҳамчун муваққатӣ эълон шудааст , сериализатсия карда намешавад (ба таври нобаёнӣ, ҳама параметрҳои синф силсилавӣ карда мешаванд)
  • Ё, ҳар як параметри синфе, ки мо мехоҳем сериализатсия кунем, бо тег қайд карда мешавад Externalizable(бо нобаёнӣ, ҳеҷ гуна параметр сериализатсия карда намешавад).
ObjectOutputStreamВақте ки ба an object даъват карда мешавад, майдони маълумот бо серия карда намешавад , агар майдони додаҳои ин an object муваққатӣ қайд карда шуда бошад . Барои намуна: private transient String password. Аз тарафи дигар, барои ба таври возеҳ эълон кардани маълумоти an object ҳамчун силсилашаванда, мо бояд синфро ҳамчун маълумоти ExternalizablewriteExternalвозеҳ readExteranlнавиштан ва хондани ин an object қайд кунем.

Хулоса

Хусусияти сериализатсияи an object дар бисёр системаҳои тақсимшуда ҳамчун роҳи интиқоли маълумот истифода мешавад. Аммо сериализатсия тафсилоти пинҳоншударо ошкор мекунад ва ба ин васила ҳаққонияти намудҳои абстрактии маълумотро нест мекунад, ки ин дар навбати худ инкапсуляцияро нест мекунад. Дар айни замон, донистани он хуш аст, ки маълумоти an objectи силсилавӣ ҳамон маълумотест, ки дар an objectи аслӣ ва аслӣ буд. Ин инчунин як имконияти олиҷаноб барои татбиқи интерфейс ObjectInputValidationва бекор кардани усул аст validateObject(), ҳатто агар сатри сершумори code истифода шавад. Агар an object ёфт нашавад, мо метавонем ба таври мувофиқ истисно гузорем InvalidObjectException. Мақолаи аслӣ: Чӣ тавр сериализатсия дар Java кор мекунад
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION