- Sorozatosítás
- Sorosozható interfész
- Példa a szerializálásra
- Példa a deszerializációra
- Sorozatosítás örökléssel
- Externalizálható interfész
- 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.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ódszer | Leí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ételt | Kiö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ódszer | Leí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:
successtö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 ravitö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:
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; } }