logo

Sorozatosítás és deszerializálás Java-ban

  1. Sorozatosítás
  2. Sorosozható interfész
  3. Példa a szerializálásra
  4. Példa a deszerializációra
  5. Sorozatosítás örökléssel
  6. Externalizálható interfész
  7. Sorozatosítás és statikus adattag

Sorozatosítás Java nyelven mechanizmusa egy objektum állapotának írása bájtfolyamba . Főleg Hibernate, RMI, JPA, EJB és JMS technológiákban használják.

A szerializálás fordított műveletét ún deszerializáció ahol a bájtfolyam objektummá alakul. A szerializálási és szerializálási folyamat platformfüggetlen, ez azt jelenti, hogy egy objektumot egy platformon szerializálhat, és egy másik platformon deszerializálhatja.

Az objektum szerializálásához a writeObject() a metódusa ObjectOutputStream osztályba, deserializációra pedig a readObject() a metódusa ObjectInputStream osztály.

Meg kell valósítanunk a Sorozatozható interfész az objektum szerializálásához.

A Java szerializálás előnyei

Főleg az objektum állapotának a hálózaton való mozgatására szolgál (ezt nevezzük rendezőnek).

java szerializálás

java.io.Serializálható felület

Sorozatozható egy marker interfész (nincs adattagja és metódusa). Java osztályok „megjelölésére” szolgál, hogy ezen osztályok objektumai bizonyos képességeket kapjanak. A Klónozható és Távoli jelölő interfészek is.

A Sorozatozható Az interfészt annak az osztálynak kell megvalósítania, amelynek objektumát fenn kell tartani.

A String osztály és az összes wrapper osztály megvalósítja a java.io.Serializálható alapértelmezés szerint interfész.

Lássuk az alábbi példát:

Diák.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; } } 

A fenti példában Diák osztály valósítja meg a Serializálható interfészt. Most az objektumai folyammá alakíthatók. A fő osztály megvalósítása a következő kódban látható.

ObjectOutputStream osztály

Az ObjectOutputStream osztály primitív adattípusok és Java objektumok OutputStreambe írására szolgál. Csak a java.io.Serializable felületet támogató objektumok írhatók adatfolyamba.

Konstruktőr

1) a nyilvános ObjectOutputStream(OutputStream out) IOException {}Létrehoz egy ObjectOutputStream-et, amely a megadott OutputStream-re ír.

Fontos módszerek

MódszerLeírás
1) public final void writeObject(Object obj) dob IOException {}A megadott objektumot az ObjectOutputStreambe írja.
2) a public void flush() kidobja a {} IOException kivételtKiöblíti az aktuális kimeneti adatfolyamot.
3) a public void close() IOExceptiont dob: {}Lezárja az aktuális kimeneti adatfolyamot.

ObjectInputStream osztály

Az ObjectInputStream deszerializálja az ObjectOutputStream segítségével írt objektumokat és primitív adatokat.

Konstruktőr

hashset vs hashmap
1) nyilvános ObjectInputStream(InputStream in) IOException {}Létrehoz egy ObjectInputStream-et, amely a megadott InputStream-ből olvas.

Fontos módszerek

MódszerLeírás
1) nyilvános végleges Object readObject() IOException, ClassNotFoundException{}Beolvas egy objektumot a bemeneti adatfolyamból.
2) a public void close() IOExceptiont dob: {}Bezárja az ObjectInputStream-et.

Példa a Java szerializálásra

Ebben a példában az objektumot szerializáljuk Diák osztály a fenti kódból. Az ObjectOutputStream osztály writeObject() metódusa biztosítja az objektum szerializálásának funkcióját. Az objektum állapotát az f.txt fájlba mentjük.

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

Kimenet:

 success 
töltse le ezt a sorozatosítási példát

Példa a Java deszerializációra

A deszerializálás az objektum szerializált állapotból való rekonstrukciójának folyamata. Ez a szerializálás fordított művelete. Lássunk egy példát, ahol egy deserializált objektumból olvassuk ki az adatokat.

A deszerializálás az objektum szerializált állapotból való rekonstrukciójának folyamata. Ez a szerializálás fordított művelete. Lássunk egy példát, ahol egy deserializált objektumból olvassuk ki az adatokat.

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

Kimenet:

211 ravi 
töltse le ezt a deserializációs példát

Java sorozatosítás örökléssel (IS-A kapcsolat)

Ha egy osztály megvalósítja Sorosozható felület akkor minden alosztálya is szerializálható lesz. Lássuk az alábbi példát:

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

Kimenet:

 success 211 ravi Engineering 50000 

A SerializeISA osztály szerializálta a Student osztály objektumot, amely kiterjeszti a Sorozható személy osztályt. A szülőosztály tulajdonságait az alosztályok öröklik, így ha a szülőosztály Serializálható, az alosztály is az lesz.

Java szerializálás aggregációval (HAS-A kapcsolat)

Ha egy osztály egy másik osztályra hivatkozik, minden hivatkozásnak sorozhatónak kell lennie, különben a sorosítási folyamat nem kerül végrehajtásra. Ilyen esetben, NotSerializableException futásidőben van dobva.

Cím.java

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

Diák.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; } } 

Mivel a cím nem szerializálható, a Hallgató osztály példányát nem lehet sorosítani.

Megjegyzés: Az objektumon belüli összes objektumnak szerializálhatónak kell lennie.

Java szerializálás a statikus adattaggal

Ha van egy statikus adattag egy osztályban, akkor az nem lesz soros, mert a static az osztály része, nem objektum.

Munkavállaló.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 szerializálás tömbbel vagy gyűjteménnyel

Szabály: Tömb vagy gyűjtemény esetén a tömb vagy gyűjtemény összes objektumának szerializálhatónak kell lennie. Ha valamelyik objektum nem szerializálható, a szerializálás sikertelen lesz.

Externalizálható java-ban

Az Externalizálható interfész lehetőséget biztosít egy objektum állapotának bájtfolyamba tömörítési formátumban történő írására. Ez nem egy marker interfész.

Az Externalizálható felület két módszert kínál:

    public void writeExternal(ObjectOutput out) IOExceptiont dob public void readExternal(ObjectInput in) IOExceptiont dob

Java átmeneti kulcsszó

Ha egy osztály egyetlen adattagját sem szeretné szerializálni, megjelölheti tranziensként.

Munkavállaló.java

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

Most az id nem lesz szerializálva, így ha a szerializálás után deszerializálja az objektumot, nem kapja meg az id értékét. Mindig az alapértelmezett értéket adja vissza. Ebben az esetben 0-t ad vissza, mivel az id adattípusa egész szám.

További részletekért látogasson el a következő oldalra.

SerialVersionUID

A futásidejű sorosítási folyamat minden SerialVersionUID néven ismert Serializálható osztályhoz egy azonosítót társít. A szerializált objektum küldőjének és fogadójának ellenőrzésére szolgál. A feladónak és a fogadónak azonosnak kell lennie. Ennek ellenőrzésére a SerialVersionUID szolgál. A küldőnek és a fogadónak ugyanazzal a SerialVersionUID-vel kell rendelkeznie, ellenkező esetben InvalidClassException a rendszer eldobja, amikor deszerializálja az objektumot. Saját SerialVersionUID-nket is deklarálhatjuk a Serializable osztályban. Ehhez létre kell hoznia egy SerialVersionUID mezőt, és értéket kell hozzárendelnie. Hosszú típusúnak kell lennie, statikus és végleges. Javasoljuk, hogy kifejezetten deklarálja a serialVersionUID mezőt az osztályban, és legyen privát is. Például:

 private static final long serialVersionUID=1L; 

Most a Serializable osztály így fog kinézni:

Munkavállaló.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; } }