logo

Serialització i deserialització en Java

  1. Serialització
  2. Interfície serializable
  3. Exemple de serialització
  4. Exemple de deserialització
  5. Serialització amb herència
  6. Interfície exterioritzable
  7. Membre de serialització i dades estàtiques

Serialització en Java és un mecanisme de escriure l'estat d'un objecte en un flux de bytes . S'utilitza principalment en tecnologies Hibernate, RMI, JPA, EJB i JMS.

S'anomena l'operació inversa de la serialització deserialització on byte-stream es converteix en un objecte. El procés de serialització i deserialització és independent de la plataforma, vol dir que podeu serialitzar un objecte en una plataforma i deserialitzar-lo en una plataforma diferent.

Per serialitzar l'objecte, anomenem el writeObject() mètode de ObjectOutputStream classe, i per a la deserialització anomenem la readObject() mètode de ObjectInputStream classe.

Hem d'haver d'implementar el Serialitzable interfície per serialitzar l'objecte.

commutador java

Avantatges de la serialització Java

S'utilitza principalment per viatjar l'estat de l'objecte a la xarxa (que es coneix com a marshalling).

serialització java

Interfície serialitzable java.io

Serialitzable és una interfície de marcador (no té cap membre de dades ni mètode). S'utilitza per 'marcar' classes Java de manera que els objectes d'aquestes classes puguin tenir una certa capacitat. El Clonable i Remot també són interfícies de marcadors.

El Serialitzable La interfície ha de ser implementada per la classe l'objecte de la qual s'ha de mantenir.

La classe String i totes les classes wrapper implementen el java.io.Serialitzable interfície per defecte.

Vegem l'exemple que es dóna a continuació:

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

En l'exemple anterior, Estudiant la classe implementa una interfície serialitzable. Ara els seus objectes es poden convertir en flux. La implementació de la classe principal de es mostra al codi següent.

Classe ObjectOutputStream

La classe ObjectOutputStream s'utilitza per escriure tipus de dades primitius i objectes Java a un OutputStream. Només els objectes que admeten la interfície java.io.Serializable es poden escriure als fluxos.

Constructor

1) ObjectOutputStream públic (outputStream out) llança IOException {}Crea un ObjectOutputStream que escriu al OutputStream especificat.

Mètodes importants

MètodeDescripció
1) public final void writeObject(Object obj) llança IOException {}Escriu l'objecte especificat a ObjectOutputStream.
2) public void flush() llança IOException {}Esborra el flux de sortida actual.
3) public void close() llança IOException {}Tanca el corrent de sortida actual.

Classe ObjectInputStream

Un ObjectInputStream deserialitza objectes i dades primitives escrites mitjançant un ObjectOutputStream.

Constructor

1) ObjectInputStream públic (InputStream in) llança IOException {}Crea un ObjectInputStream que llegeix des de l'InputStream especificat.

Mètodes importants

MètodeDescripció
1) Objecte final públic readObject() llança IOException, ClassNotFoundException{}Llegeix un objecte del flux d'entrada.
2) public void close() llança IOException {}Tanca ObjectInputStream.

Exemple de serialització de Java

En aquest exemple, serialitzarem l'objecte de Estudiant classe del codi anterior. El mètode writeObject() de la classe ObjectOutputStream proporciona la funcionalitat per serialitzar l'objecte. Estem desant l'estat de l'objecte al fitxer anomenat 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);} } } 

Sortida:

 success 
descarregueu aquest exemple de serialització

Exemple de deserialització de Java

La deserialització és el procés de reconstrucció de l'objecte a partir de l'estat serialitzat. És l'operació inversa de la serialització. Vegem un exemple on estem llegint les dades d'un objecte deserialitzat.

La deserialització és el procés de reconstrucció de l'objecte a partir de l'estat serialitzat. És l'operació inversa de la serialització. Vegem un exemple on estem llegint les dades d'un objecte deserialitzat.

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

Sortida:

211 ravi 
descarregueu aquest exemple de deserialització

Serialització de Java amb herència (relació IS-A)

Si una classe implementa Interfície serialitzable llavors totes les seves subclasses també seran serialitzables. Vegem l'exemple que es dóna a continuació:

SerializeISA.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);} } } 

Sortida:

 success 211 ravi Engineering 50000 

La classe SerializeISA ha serialitzat l'objecte de classe Student que amplia la classe Person que és serializable. Les propietats de la classe pare s'hereten a les subclasses, de manera que si la classe pare és serializable, la subclasse també ho seria.

què vol dir xdxd

Serialització de Java amb agregació (relació HAS-A)

Si una classe té una referència a una altra classe, totes les referències han de ser serialitzables, en cas contrari, el procés de serialització no es realitzarà. En aquest cas, NotSerializableException es llança en temps d'execució.

Address.java

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

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

Com que Address no es pot serializar, no podeu serialitzar la instància de la classe Student.

Nota: Tots els objectes d'un objecte han de ser serialitzables.

Serialització de Java amb el membre de dades estàtiques

Si hi ha algun membre de dades estàtiques en una classe, no es serialitzarà perquè estàtica és la part de la classe no l'objecte.

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

Serialització Java amb matriu o col·lecció

Regla: en cas de matriu o col·lecció, tots els objectes de matriu o col·lecció han de ser serialitzables. Si algun objecte no es pot serialitzar, la serialització fallarà.

Externalitzable en java

La interfície Externalizable proporciona la facilitat d'escriure l'estat d'un objecte en un flux de bytes en format comprimit. No és una interfície de marcador.

La interfície Externalitzable ofereix dos mètodes:

    public void writeExternal(ObjectOutput out) llança IOException public void readExternal(ObjectInput in) llança IOException

Paraula clau transitòria de Java

Si no voleu serialitzar cap membre de dades d'una classe, podeu marcar-la com a transitòria.

Employee.java

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

Ara, id no es serialitzarà, de manera que quan deserialitzeu l'objecte després de la serialització, no obtindreu el valor d'id. Sempre retornarà el valor predeterminat. En aquest cas, retornarà 0 perquè el tipus de dades d'id és un nombre enter.

Visiteu la pàgina següent per a més detalls.

SerialVersionUID

El procés de serialització en temps d'execució associa un identificador amb cada classe Serializable que es coneix com a SerialVersionUID. S'utilitza per verificar l'emissor i el receptor de l'objecte serialitzat. L'emissor i el receptor han de ser el mateix. Per verificar-ho, s'utilitza SerialVersionUID. L'emissor i el receptor han de tenir el mateix SerialVersionUID, en cas contrari, InvalidClassException es llançarà quan deserialitzeu l'objecte. També podem declarar el nostre propi SerialVersionUID a la classe Serializable. Per fer-ho, heu de crear un camp SerialVersionUID i assignar-li un valor. Ha de ser del tipus llarg amb estàtica i final. Es recomana declarar explícitament el camp serialVersionUID a la classe i tenir-lo privat també. Per exemple:

 private static final long serialVersionUID=1L; 

Ara, la classe Serializable tindrà aquest aspecte:

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