logo

Serijalizacija i deserijalizacija u Javi

  1. Serijalizacija
  2. Sučelje koje se može serijalizirati
  3. Primjer serijalizacije
  4. Primjer deserijalizacije
  5. Serijalizacija s nasljeđivanjem
  6. Eksternalibilno sučelje
  7. Serijalizacija i statički podatkovni član

Serijalizacija u Javi je mehanizam od pisanje stanja objekta u niz bajtova . Uglavnom se koristi u tehnologijama Hibernate, RMI, JPA, EJB i JMS.

Poziva se obratna operacija serijalizacije deserijalizacija gdje se tok bajtova pretvara u objekt. Proces serijalizacije i deserijalizacije neovisan je o platformi, što znači da možete serijalizirati objekt na jednoj platformi i deserijalizirati ga na drugoj platformi.

Za serijalizaciju objekta nazivamo writeObject() metoda od ObjectOutputStream klasa, a za deserijalizaciju nazivamo readObject() metoda od ObjectInputStream razreda.

Moramo implementirati Serializable sučelje za serijalizaciju objekta.

Prednosti Java serijalizacije

Uglavnom se koristi za kretanje stanja objekta na mreži (što je poznato kao marshalling).

java serijalizacija

java.io.Serializable sučelje

Serializable je marker sučelje (nema podatkovni član i metodu). Koristi se za 'označavanje' Java klasa tako da objekti tih klasa mogu dobiti određenu sposobnost. The Može se klonirati i Daljinski također su markerska sučelja.

The Serializable sučelje mora implementirati klasa čiji objekt treba postojati.

Klasa String i sve klase omotači implementiraju java.io.Serializable sučelje prema zadanim postavkama.

Pogledajmo primjer u nastavku:

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

U gornjem primjeru, Student klasa implementira Serializable sučelje. Sada se njegovi objekti mogu pretvoriti u tok. Implementacija glavne klase prikazana je u sljedećem kodu.

string java sadrži

Klasa ObjectOutputStream

Klasa ObjectOutputStream koristi se za pisanje primitivnih tipova podataka i Java objekata u OutputStream. Samo objekti koji podržavaju sučelje java.io.Serializable mogu se pisati u tokove.

Konstruktor

1) javni ObjectOutputStream(OutputStream out) izbacuje IOException {}Stvara ObjectOutputStream koji piše u navedeni OutputStream.

Važne metode

metodaOpis
1) public final void writeObject(Object obj) izbacuje IOException {}Zapisuje navedeni objekt u ObjectOutputStream.
2) public void flush() izbacuje IOException {}Ispire trenutni izlazni tok.
3) public void close() izbacuje IOException {}Zatvara trenutni izlazni tok.

Klasa ObjectInputStream

ObjectInputStream deserializira objekte i primitivne podatke napisane pomoću ObjectOutputStream.

Konstruktor

1) javni ObjectInputStream(InputStream in) izbacuje IOException {}Stvara ObjectInputStream koji čita iz navedenog InputStream-a.

Važne metode

metodaOpis
1) javni konačni Object readObject() izbacuje IOException, ClassNotFoundException{}Čita objekt iz ulaznog toka.
2) public void close() izbacuje IOException {}Zatvara ObjectInputStream.

Primjer Java serijalizacije

U ovom primjeru ćemo serijalizirati objekt Student klasa iz gornjeg koda. Metoda writeObject() klase ObjectOutputStream pruža funkcionalnost za serijalizaciju objekta. Spremamo stanje objekta u datoteku pod nazivom f.txt.

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

Izlaz:

 success 
preuzmite ovaj primjer serijalizacije

Primjer Java deserijalizacije

Deserijalizacija je proces rekonstrukcije objekta iz serijaliziranog stanja. To je obrnuta operacija od serijalizacije. Pogledajmo primjer gdje čitamo podatke iz deserijaliziranog objekta.

Deserijalizacija je proces rekonstrukcije objekta iz serijaliziranog stanja. To je obrnuta operacija od serijalizacije. Pogledajmo primjer gdje čitamo podatke iz deserijaliziranog objekta.

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

Izlaz:

211 ravi 
preuzmite ovaj primjer deserijalizacije

Java serijalizacija s nasljeđivanjem (odnos IS-A)

Ako klasa implementira Serializable sučelje tada će se sve njegove podklase također moći serijalizirati. Pogledajmo primjer u nastavku:

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

Izlaz:

 success 211 ravi Engineering 50000 

Klasa SerializeISA serijalizirala je objekt klase Student koji proširuje klasu Osoba koja se može serijalizirati. Svojstva nadređene klase nasljeđuju se na podklase, pa ako je nadređena klasa Serializable, podklasa bi također bila.

aps c kod

Java serijalizacija s agregacijom (odnos HAS-A)

Ako klasa ima referencu na drugu klasu, sve reference moraju biti Serializable inače se proces serijalizacije neće izvršiti. U takvom slučaju, NotSerializableException izbacuje se tijekom izvođenja.

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

Budući da se adresa ne može serijalizirati, ne možete serijalizirati instancu klase Student.

Napomena: Svi objekti unutar objekta moraju biti Serializable.

Java serijalizacija sa statičkim podatkovnim članom

Ako u klasi postoji bilo koji statički podatkovni član, on neće biti serijaliziran jer je statični dio klase, a ne objekt.

Zaposlenik.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 serijalizacija s nizom ili kolekcijom

Pravilo: U slučaju niza ili zbirke, svi objekti niza ili zbirke moraju se moći serijalizirati. Ako bilo koji objekt nije moguće serijalizirati, serijalizacija neće biti uspješna.

Moguće eksternalizirati u Javi

Externalizable sučelje pruža mogućnost pisanja stanja objekta u tok bajtova u komprimiranom formatu. To nije sučelje markera.

Externalizable sučelje nudi dvije metode:

    public void writeExternal(ObjectOutput out) izbacuje IOException public void readExternal(ObjectInput in) izbacuje IOException

Java prijelazna ključna riječ

Ako ne želite serijalizirati niti jedan podatkovni član klase, možete ga označiti kao prolaznog.

Zaposlenik.java

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

Sada, id neće biti serijaliziran, pa kada deserijalizirate objekt nakon serijalizacije, nećete dobiti vrijednost id-a. Uvijek će vratiti zadanu vrijednost. U tom će slučaju vratiti 0 jer je vrsta podataka id-a cijeli broj.

Posjetite sljedeću stranicu za više detalja.

SerialVersionUID

Proces serijalizacije u vremenu izvođenja pridružuje ID svakoj klasi koja se može serijalizirati koja je poznata kao SerialVersionUID. Koristi se za provjeru pošiljatelja i primatelja serijaliziranog objekta. Pošiljatelj i primatelj moraju biti isti. Za provjeru se koristi SerialVersionUID. Pošiljatelj i primatelj moraju imati isti SerialVersionUID, inače, InvalidClassException bit će izbačeno kada deserijalizirate objekt. Također možemo deklarirati vlastiti SerialVersionUID u klasi Serializable. Da biste to učinili, morate stvoriti polje SerialVersionUID i dodijeliti mu vrijednost. Mora biti dugog tipa sa statičnim i završnim. Predlaže se izričito deklarirati polje serialVersionUID u klasi i također ga postaviti kao privatno. Na primjer:

 private static final long serialVersionUID=1L; 

Sada će Serializable klasa izgledati ovako:

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