logo

Serializace a deserializace v Javě

  1. Serializace
  2. Serializovatelné rozhraní
  3. Příklad serializace
  4. Příklad deseralizace
  5. Serializace s dědičností
  6. Externalizovatelné rozhraní
  7. Serializace a statický datový člen

Serializace v Javě je mechanismus zápis stavu objektu do byte-streamu . Používá se především v technologiích Hibernate, RMI, JPA, EJB a JMS.

Opačná operace serializace se nazývá deserializace kde se byte-stream převádí na objekt. Proces serializace a deserializace je nezávislý na platformě, to znamená, že můžete objekt serializovat na jedné platformě a deserializovat jej na jiné platformě.

Pro serializaci objektu nazýváme writeObject() metoda ObjectOutputStream třídy a pro deserializaci nazýváme readObject() metoda ObjectInputStream třída.

Musíme implementovat Serializovatelné rozhraní pro serializaci objektu.

Výhody serializace Java

Používá se hlavně k cestování po stavu objektu v síti (to je známé jako seřazování).

serializace java

java.io.Serializovatelné rozhraní

Serializovatelné je rozhraní značky (nemá žádný datový člen a metodu). Používá se k „označení“ tříd Java, takže objekty těchto tříd mohou získat určitou schopnost. The Klonovatelné a Dálkový jsou také rozhraní značek.

The Serializovatelné rozhraní musí být implementováno třídou, jejíž objekt má být zachován.

Třída String a všechny třídy wrapper implementují java.io.Serializovatelný rozhraní ve výchozím nastavení.

Podívejme se na příklad uvedený níže:

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

Ve výše uvedeném příkladu Student třída implementuje serializovatelné rozhraní. Nyní lze jeho objekty převést na proud. Implementace hlavní třídy je uvedena v dalším kódu.

Třída ObjectOutputStream

Třída ObjectOutputStream se používá k zápisu primitivních datových typů a objektů Java do OutputStream. Do streamů lze zapisovat pouze objekty, které podporují rozhraní java.io.Serializable.

Konstruktér

srovnání java řetězců
1) public ObjectOutputStream(OutputStream out) vyvolá IOException {}Vytvoří ObjectOutputStream, který zapisuje do zadaného OutputStream.

Důležité metody

MetodaPopis
1) public final void writeObject(Object obj) vyvolá IOException {}Zapíše zadaný objekt do ObjectOutputStream.
2) public void flush() vyvolá IOException {}Proplachuje aktuální výstupní proud.
3) public void close() vyvolá IOException {}Uzavře aktuální výstupní proud.

Třída ObjectInputStream

ObjectInputStream deserializuje objekty a primitivní data zapsaná pomocí ObjectOutputStream.

Konstruktér

1) public ObjectInputStream (InputStream in) vyvolá IOException {}Vytvoří ObjectInputStream, který čte ze zadaného InputStream.

Důležité metody

MetodaPopis
1) public final Object readObject() vyvolá IOException, ClassNotFoundException{}Čte objekt ze vstupního proudu.
2) public void close() vyvolá IOException {}Uzavře ObjectInputStream.

Příklad serializace Java

V tomto příkladu budeme serializovat objekt Student třídy z výše uvedeného kódu. Metoda writeObject() třídy ObjectOutputStream poskytuje funkci pro serializaci objektu. Stav objektu ukládáme do souboru s názvem 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);} } } 

Výstup:

 success 
stáhněte si tento příklad serializace

Příklad deserializace Java

Deserializace je proces rekonstrukce objektu ze serializovaného stavu. Je to obrácená operace serializace. Podívejme se na příklad, kdy čteme data z deserializovaného objektu.

Deserializace je proces rekonstrukce objektu ze serializovaného stavu. Je to obrácená operace serializace. Podívejme se na příklad, kdy čteme data z deserializovaného objektu.

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

Výstup:

211 ravi 
stáhněte si tento příklad deseralizace

Serializace Java s dědičností (vztah IS-A)

Pokud třída implementuje Serializovatelné rozhraní pak všechny jeho podtřídy budou také serializovatelné. Podívejme se na příklad uvedený níže:

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

Výstup:

 success 211 ravi Engineering 50000 

Třída SerializeISA serializovala objekt třídy Student, který rozšiřuje třídu Person, která je serializovatelná. Vlastnosti nadřazené třídy se dědí na podtřídy, takže pokud je nadřazená třída serializovatelná, podtřída by také byla.

Serializace Java s agregací (HAS-A Relationship)

Pokud má třída odkaz na jinou třídu, musí být všechny odkazy serializovatelné, jinak se proces serializace neprovede. V takovém případě, NotSerializableException je vyvolán za běhu.

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

Protože adresa není serializovatelná, nemůžete serializovat instanci třídy Student.

Poznámka: Všechny objekty v objektu musí být serializovatelné.

Java serializace se statickým datovým členem

Pokud je ve třídě jakýkoli statický datový člen, nebude serializován, protože statický je částí třídy, nikoli objektem.

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

Java serializace s polem nebo kolekcí

Pravidlo: V případě pole nebo kolekce musí být všechny objekty pole nebo kolekce serializovatelné. Pokud některý objekt nelze serializovat, serializace se nezdaří.

Externalizovatelné v Javě

Externalizovatelné rozhraní poskytuje možnost zápisu stavu objektu do byte streamu v komprimovaném formátu. Nejedná se o rozhraní značky.

Rozhraní Externalizable poskytuje dvě metody:

    public void writeExternal(ObjectOutput out) vyvolá IOException public void readExternal(ObjectInput in) vyvolá IOException

Přechodné klíčové slovo Java

Pokud nechcete serializovat žádný datový člen třídy, můžete jej označit jako přechodný.

Employee.java

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

Nyní se id nebude serializovat, takže když deserializujete objekt po serializaci, nezískáte hodnotu id. Vždy vrátí výchozí hodnotu. V takovém případě vrátí 0, protože datový typ id je celé číslo.

Další podrobnosti naleznete na další stránce.

SerialVersionUID

Proces serializace za běhu přidruží ID ke každé třídě Serializable, která je známá jako SerialVersionUID. Používá se k ověření odesílatele a příjemce serializovaného objektu. Odesílatel a příjemce musí být stejní. K ověření se používá SerialVersionUID. Odesílatel a příjemce musí mít stejné SerialVersionUID, jinak InvalidClassException bude vyhozen při deserializaci objektu. Můžeme také deklarovat vlastní SerialVersionUID ve třídě Serializable. Chcete-li tak učinit, musíte vytvořit pole SerialVersionUID a přiřadit mu hodnotu. Musí být dlouhého typu se statickým a konečným. Doporučuje se explicitně deklarovat pole serialVersionUID ve třídě a mít je také soukromé. Například:

 private static final long serialVersionUID=1L; 

Nyní bude třída Serializable vypadat takto:

Employee.java

menu nastavení pro android
 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; } }