- Serialització
- Interfície serializable
- Exemple de serialització
- Exemple de deserialització
- Serialització amb herència
- Interfície exterioritzable
- 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).
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ètode | Descripció |
---|---|
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ètode | Descripció |
---|---|
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:
successdescarregueu 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 ravidescarregueu 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:
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; } }