logo

Сериализация и десериализация в Java

  1. Сериализация
  2. Сериализиращ се интерфейс
  3. Пример за сериализация
  4. Пример за десериализация
  5. Сериализация с наследяване
  6. Външен интерфейс
  7. Член на сериализация и статични данни

Сериализация в Java е механизъм на запис на състоянието на обект в поток от байтове . Използва се главно в технологиите Hibernate, RMI, JPA, EJB и JMS.

Извиква се обратната операция на сериализация десериализация където потокът от байтове се преобразува в обект. Процесът на сериализация и десериализация е независим от платформата, което означава, че можете да сериализирате обект на една платформа и да го десериализирате на друга платформа.

За сериализиране на обекта, ние наричаме writeObject() метод на ObjectOutputStream клас, а за десериализация наричаме readObject() метод на ObjectInputStream клас.

Ние трябва да прилагаме Може да се сериализира интерфейс за сериализиране на обекта.

Предимства на Java Serialization

Използва се главно за пренасяне на състоянието на обекта в мрежата (това е известно като маршалинг).

java сериализация

java.io.Serializable интерфейс

Може да се сериализира е маркерен интерфейс (няма член на данни и метод). Използва се за „маркиране“ на Java класове, така че обектите от тези класове да могат да получат определена способност. The Може да се клонира и Дистанционно също са маркерни интерфейси.

азбука на числата

The Може да се сериализира интерфейсът трябва да бъде имплементиран от класа, чийто обект трябва да бъде запазен.

Класът String и всички класове обвивки изпълняват java.io.Serializable интерфейс по подразбиране.

Нека видим примера, даден по-долу:

Студент.java

 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; } } 

В горния пример, Студент класът имплементира сериализуем интерфейс. Сега неговите обекти могат да бъдат преобразувани в поток. Реализацията на основния клас е показана в следващия код.

Клас ObjectOutputStream

Класът ObjectOutputStream се използва за запис на примитивни типове данни и Java обекти в OutputStream. Само обекти, които поддържат интерфейса java.io.Serializable, могат да се записват в потоци.

Конструктор

1) публичен ObjectOutputStream(OutputStream out) хвърля IOException {}Той създава ObjectOutputStream, който записва в посочения OutputStream.

Важни методи

МетодОписание
1) public final void writeObject(Object obj) хвърля IOException {}Той записва посочения обект в ObjectOutputStream.
2) public void flush() хвърля IOException {}Промива текущия изходен поток.
3) public void close() хвърля IOException {}Той затваря текущия изходен поток.

Клас ObjectInputStream

ObjectInputStream десериализира обекти и примитивни данни, записани с помощта на ObjectOutputStream.

Конструктор

пример за java do while
1) публичен ObjectInputStream(InputStream in) хвърля IOException {}Той създава ObjectInputStream, който чете от посочения InputStream.

Важни методи

моят жив крикет
МетодОписание
1) публичен финален обект readObject() хвърля IOException, ClassNotFoundException{}Той чете обект от входния поток.
2) public void close() хвърля IOException {}Той затваря ObjectInputStream.

Пример за сериализация на Java

В този пример ще сериализираме обекта на Студент клас от горния код. Методът writeObject() на класа ObjectOutputStream предоставя функционалността за сериализиране на обекта. Записваме състоянието на обекта във файла с име f.txt.

Persist.java

 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 
изтеглете този пример за сериализация

Пример за десериализация на Java

Десериализацията е процесът на реконструиране на обекта от сериализираното състояние. Това е обратната операция на сериализацията. Нека да видим пример, в който четем данните от десериализиран обект.

Десериализацията е процесът на реконструиране на обекта от сериализираното състояние. Това е обратната операция на сериализацията. Нека да видим пример, в който четем данните от десериализиран обект.

Depersist.java

 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 
изтеглете този пример за десериализация

Сериализация на Java с наследяване (връзка IS-A)

Ако даден клас изпълнява Сериализиращ се интерфейс тогава всички негови подкласове също ще могат да се сериализират. Нека видим примера, даден по-долу:

df.loc

Сериализиране на ISA.java

 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 

Класът SerializeISA сериализира обекта на клас Student, който разширява класа Person, който е Serializable. Свойствата на родителския клас се наследяват от подкласове, така че ако родителският клас е сериализуем, подкласът също ще бъде.

Сериализация на Java с агрегиране (връзка HAS-A)

Ако даден клас има препратка към друг клас, всички препратки трябва да могат да се сериализират, в противен случай процесът на сериализация няма да бъде извършен. В такъв случай, NotSerializableException се хвърля по време на изпълнение.

Адрес.java

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

Студент.java

 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; } } 

Тъй като адресът не може да се сериализира, не можете да сериализирате екземпляра на класа Student.

Забележка: Всички обекти в рамките на един обект трябва да могат да се сериализират.

Сериализация на Java със статичен член на данните

Ако има статичен член на данните в клас, той няма да бъде сериализиран, защото статиката е част от класа, а не обект.

Служител.java

 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; } } 

Java сериализация с масив или колекция

Правило: В случай на масив или колекция, всички обекти на масив или колекция трябва да могат да се сериализират. Ако някой обект не може да бъде сериализиран, сериализирането ще бъде неуспешно.

Възможност за екстернализиране в java

Интерфейсът Externalizable предоставя възможност за запис на състоянието на обект в поток от байтове в компресиран формат. Това не е маркерен интерфейс.

Externalizable интерфейсът предоставя два метода:

    public void writeExternal(ObjectOutput out) хвърля IOException public void readExternal(ObjectInput in) хвърля IOException

Преходна ключова дума на Java

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

Служител.java

статичен в c
 class Employee implements Serializable{ transient int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

Сега id няма да бъде сериализиран, така че когато десериализирате обекта след сериализацията, няма да получите стойността на id. Винаги ще връща стойност по подразбиране. В такъв случай той ще върне 0, тъй като типът данни на id е цяло число.

Посетете следващата страница за повече подробности.

SerialVersionUID

Процесът на сериализация по време на изпълнение свързва id с всеки Serializable клас, който е известен като SerialVersionUID. Използва се за проверка на подателя и получателя на сериализирания обект. Изпращачът и получателят трябва да са едни и същи. За да го проверите, се използва SerialVersionUID. Подателят и получателят трябва да имат един и същ SerialVersionUID, в противен случай, InvalidClassException ще бъде хвърлен, когато десериализирате обекта. Можем също да декларираме нашия собствен SerialVersionUID в класа Serializable. За да направите това, трябва да създадете поле SerialVersionUID и да му присвоите стойност. Трябва да е от дългия тип със статично и окончателно. Предлага се изрично да се декларира полето serialVersionUID в класа и то също да бъде частно. Например:

 private static final long serialVersionUID=1L; 

Сега класът Serializable ще изглежда така:

Служител.java

 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; } }