logo

Серијализација и десериализација у Јави

  1. Серијализација
  2. Сериализабле Интерфаце
  3. Пример серијализације
  4. Пример десериализације
  5. Серијализација са наслеђивањем
  6. Интерфејс који се може екстернализовати
  7. Члан серијализације и статичких података

Серијализација у Јави је механизам за записивање стања објекта у бајт-ток . Углавном се користи у Хибернате, РМИ, ЈПА, ЕЈБ и ЈМС технологијама.

Реверзна операција серијализације се зове десеријализација где се бајт-ток конвертује у објекат. Процес серијализације и десеријализације је независан од платформе, што значи да можете серијализирати објекат на једној платформи и десериализовати га на другој платформи.

За серијализацију објекта, зовемо вритеОбјецт() метод ОбјецтОутпутСтреам класе, а за десериализацију зовемо реадОбјецт() метод ОбјецтИнпутСтреам класа.

Морамо да применимо Сериализабле интерфејс за серијализацију објекта.

Предности Јава серијализације

Углавном се користи за путовање стања објекта на мрежи (што је познато као маршалирање).

јава серијализација

јава.ио.Сериализабле интерфејс

Сериализабле је интерфејс маркера (нема члана података и метод). Користи се за 'означавање' Јава класа тако да објекти ових класа могу добити одређену способност. Тхе Цлонеабле и Ремоте су такође интерфејси маркера.

Тхе Сериализабле интерфејс мора да имплементира класа чији објекат треба да се задржи.

Стринг класа и све класе омотача имплементирају јава.ио.Сериализабле интерфејс подразумевано.

Погледајмо пример дат у наставку:

Студент.јава

стринг као низ
 import java.io.Serializable; public class Student implements Serializable{ int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

У горњем примеру, Ученик класа имплементира интерфејс који се може серијализовати. Сада се његови објекти могу претворити у стреам. Основна имплементација класе приказана је у следећем коду.

ОбјецтОутпутСтреам цласс

Класа ОбјецтОутпутСтреам се користи за писање примитивних типова података и Јава објеката у ОутпутСтреам. Само објекти који подржавају јава.ио.Сериализабле интерфејс могу да се уписују у стреамове.

Цонструцтор

1) јавни ОбјецтОутпутСтреам(ОутпутСтреам оут) избацује ИОЕкцептион {}Он ствара ОбјецтОутпутСтреам који пише у наведени ОутпутСтреам.

Важне методе

МетодОпис
1) публиц финал воид вритеОбјецт(Објецт обј) баца ИОЕкцептион {}Записује наведени објекат у ОбјецтОутпутСтреам.
2) публиц воид флусх() избацује ИОЕкцептион {}Испира тренутни излазни ток.
3) публиц воид цлосе() баца ИОЕкцептион {}Затвара тренутни излазни ток.

ОбјецтИнпутСтреам цласс

ОбјецтИнпутСтреам десеријализује објекте и примитивне податке написане помоћу ОбјецтОутпутСтреам-а.

Цонструцтор

1) јавни ОбјецтИнпутСтреам(ИнпутСтреам ин) баца ИОЕкцептион {}Он креира ОбјецтИнпутСтреам који чита из наведеног ИнпутСтреам-а.

Важне методе

МетодОпис
1) јавни коначни објекат реадОбјецт() избацује ИОЕкцептион, ЦлассНотФоундЕкцептион{}Чита објекат из улазног тока.
2) публиц воид цлосе() баца ИОЕкцептион {}Затвара ОбјецтИнпутСтреам.

Пример Јава серијализације

У овом примеру ћемо серијалисати објекат од Ученик класе из горњег кода. Метод вритеОбјецт() класе ОбјецтОутпутСтреам пружа функционалност за серијализацију објекта. Стање објекта чувамо у датотеци под називом ф.ткт.

Персист.јава

 import java.io.*; class Persist{ public static void main(String args[]){ try{ //Creating the object Student s1 =new Student(211,'ravi'); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} } } 

Излаз:

 success 
преузмите овај пример серијализације

Пример Јава десериализације

Десеријализација је процес реконструкције објекта из серијализованог стања. То је обрнута операција серијализације. Хајде да видимо пример где читамо податке из десеријализованог објекта.

Десеријализација је процес реконструкције објекта из серијализованог стања. То је обрнута операција серијализације. Хајде да видимо пример где читамо податке из десеријализованог објекта.

Деперсист.јава

 import java.io.*; class Depersist{ public static void main(String args[]){ try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

Излаз:

211 ravi 
преузмите овај пример десериализације

Јава серијализација са наслеђивањем (ИС-А веза)

Ако класа имплементира Серијски интерфејс онда ће све његове подкласе такође бити серијализоване. Погледајмо пример дат у наставку:

СериализеИСА.јава

читати јсон датотеке
 import java.io.Serializable; class Person implements Serializable{ int id; String name; Person(int id, String name) { this.id = id; this.name = name; } } class Student extends Person{ String course; int fee; public Student(int id, String name, String course, int fee) { super(id,name); this.course=course; this.fee=fee; } } public class SerializeISA { public static void main(String args[]) { try{ //Creating the object Student s1 =new Student(211,'ravi','Engineering',50000); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name+' '+s.course+' '+s.fee); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

Излаз:

 success 211 ravi Engineering 50000 

Класа СериализеИСА је серијализовала објекат класе Студент који проширује класу Персон која се може серијализовати. Својства родитељске класе се наслеђују од подкласа, тако да ако је родитељска класа Сериализабле, подкласа би такође била.

Јава серијализација са агрегацијом (ХАС-А веза)

Ако класа има референцу на другу класу, све референце морају бити серијализоване, иначе се процес серијализације неће извршити. У том случају, НотСериализаблеЕкцептион се баца у време извођења.

Адреса.јава

 class Address{ String addressLine,city,state; public Address(String addressLine, String city, String state) { this.addressLine=addressLine; this.city=city; this.state=state; } } 

Студент.јава

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; Address address;//HAS-A public Student(int id, String name) { this.id = id; this.name = name; } } 

Пошто адреса није серијализабилна, не можете серијализирати инстанцу класе Студент.

Напомена: Сви објекти унутар објекта морају бити серијализабилни.

Јава серијализација са статичким чланом података

Ако у класи постоји било који статички члан података, он неће бити серијализован јер је статички део класе, а не објекат.

Емплоиее.јава

 class Employee implements Serializable{ int id; String name; static String company='SSS IT Pvt Ltd';//it won't be serialized public Student(int id, String name) { this.id = id; this.name = name; } } 

Јава серијализација са низом или колекцијом

Правило: У случају низа или колекције, сви објекти низа или колекције морају бити серијализовани. Ако било који објекат не може да се серијализује, серијализација ће бити неуспешна.

Може се екстернализовати у Јави

Интерфејс који се може екстернализовати пружа могућност писања стања објекта у ток бајтова у формату компресије. То није интерфејс маркера.

Интерфејс који се може екстернализовати пружа две методе:

јава 8 функције
    публиц воид вритеЕктернал(ОбјецтОутпут оут) избацује ИОЕкцептион публиц воид реадЕктернал(ОбјецтИнпут ин) баца ИОЕкцептион

Јава Трансиент Кеиворд

Ако не желите да сериализујете ниједног члана података класе, можете га означити као пролазног.

Емплоиее.јава

 class Employee implements Serializable{ transient int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

Сада, ид неће бити серијализован, тако да када десериализујете објекат након серијализације, нећете добити вредност ид-а. Увек ће враћати подразумевану вредност. У том случају, вратиће 0 јер је тип података ид цео број.

Посетите следећу страницу за више детаља.

СериалВерсионУИД

Процес серијализације током времена извршавања повезује ид са сваком класом која се може сериализовати која је позната као СериалВерсионУИД. Користи се за верификацију пошиљаоца и примаоца серијализованог објекта. Пошиљалац и прималац морају бити исти. Да бисте то проверили, користи се СериалВерсионУИД. Пошиљалац и прималац морају имати исти СериалВерсионУИД, у супротном, ИнвалидЦлассЕкцептион ће бити бачен када десериализујете објекат. Такође можемо да декларишемо сопствени СериалВерсионУИД у класи Сериализабле. Да бисте то урадили, потребно је да креирате поље СериалВерсионУИД и доделите му вредност. Мора бити дугачког типа са статичним и коначним. Предлаже се да се експлицитно декларише поље сериалВерсионУИД у класи и да оно буде приватно. На пример:

 private static final long serialVersionUID=1L; 

Сада ће класа Сериализабле изгледати овако:

Емплоиее.јава

 import java.io.Serializable; class Employee implements Serializable{ private static final long serialVersionUID=1L; int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } }