- Сериализация
- Сериализиращ се интерфейс
- Пример за сериализация
- Пример за десериализация
- Сериализация с наследяване
- Външен интерфейс
- Член на сериализация и статични данни
Сериализация в Java е механизъм на запис на състоянието на обект в поток от байтове . Използва се главно в технологиите Hibernate, RMI, JPA, EJB и JMS.
Извиква се обратната операция на сериализация десериализация където потокът от байтове се преобразува в обект. Процесът на сериализация и десериализация е независим от платформата, което означава, че можете да сериализирате обект на една платформа и да го десериализирате на друга платформа.
За сериализиране на обекта, ние наричаме writeObject() метод на ObjectOutputStream клас, а за десериализация наричаме readObject() метод на ObjectInputStream клас.
Ние трябва да прилагаме Може да се сериализира интерфейс за сериализиране на обекта.
Предимства на Java Serialization
Използва се главно за пренасяне на състоянието на обекта в мрежата (това е известно като маршалинг).
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 интерфейсът предоставя два метода:
Преходна ключова дума на 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; } }