- Serijalizacija
- Sučelje koje se može serijalizirati
- Primjer serijalizacije
- Primjer deserijalizacije
- Serijalizacija s nasljeđivanjem
- Eksternalibilno sučelje
- 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.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
metoda | Opis |
---|---|
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
metoda | Opis |
---|---|
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:
successpreuzmite 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 ravipreuzmite 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:
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; } }