logo

Serializacija in deserializacija v Javi

  1. Serializacija
  2. Serializable vmesnik
  3. Primer serializacije
  4. Primer deserializacije
  5. Serializacija z dedovanjem
  6. Zunanji vmesnik
  7. Serializacija in statični podatkovni član

Serializacija v Javi je mehanizem za pisanje stanja objekta v tok bajtov . Uporablja se predvsem v tehnologijah Hibernate, RMI, JPA, EJB in JMS.

Imenuje se obratna operacija serializacije deserializacija kjer se bajtni tok pretvori v objekt. Postopek serializacije in deserializacije je neodvisen od platforme, kar pomeni, da lahko objekt serializirate na eni platformi in ga deserializirate na drugi platformi.

Za serializacijo predmeta imenujemo writeObject() metoda ObjectOutputStream razred, za deserializacijo pa imenujemo readObject() metoda ObjectInputStream razred.

Moramo izvajati Serializable vmesnik za serializacijo objekta.

Prednosti Java Serialization

Uporablja se predvsem za premikanje stanja objekta v omrežju (to je znano kot ranžiranje).

java serializacija

java.io.Serializable vmesnik

Serializable je označevalni vmesnik (nima podatkovnega člana in metode). Uporablja se za 'označevanje' razredov Java, tako da objekti teh razredov lahko dobijo določeno zmogljivost. The Klonirati in Daljinsko so tudi označevalni vmesniki.

The Serializable vmesnik mora implementirati razred, katerega objekt je treba obdržati.

Razred String in vsi ovojni razredi izvajajo java.io.Serializable vmesnik privzeto.

alfa beta obrezovanje

Oglejmo si spodnji primer:

Študent.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; } } 

V zgornjem primeru Študent razred implementira vmesnik Serializable. Zdaj je mogoče njegove predmete pretvoriti v tok. Izvedba glavnega razreda je prikazana v naslednji kodi.

Razred ObjectOutputStream

Razred ObjectOutputStream se uporablja za pisanje primitivnih tipov podatkov in objektov Java v OutputStream. V tokove je mogoče zapisati samo objekte, ki podpirajo vmesnik java.io.Serializable.

Konstruktor

1) javni ObjectOutputStream(OutputStream out) vrže IOException {}Ustvari ObjectOutputStream, ki piše v navedeni OutputStream.

Pomembne metode

MetodaOpis
1) javni končni void writeObject(Object obj) vrže IOException {}Podani predmet zapiše v ObjectOutputStream.
2) javni void flush() vrže izjemo IOException {}Izpira trenutni izhodni tok.
3) public void close() vrže IOException {}Zapre trenutni izhodni tok.

Razred ObjectInputStream

ObjectInputStream deserializira objekte in primitivne podatke, zapisane z uporabo ObjectOutputStream.

Konstruktor

1) javni ObjectInputStream(InputStream in) vrže IOException {}Ustvari ObjectInputStream, ki bere iz navedenega InputStream.

Pomembne metode

MetodaOpis
1) javni končni Object readObject() vrže IOException, ClassNotFoundException{}Prebere predmet iz vhodnega toka.
2) public void close() vrže IOException {}Zapre ObjectInputStream.

Primer Java Serialization

V tem primeru bomo serializirali predmet Študent razred iz zgornje kode. Metoda writeObject() razreda ObjectOutputStream zagotavlja funkcionalnost za serializacijo predmeta. Stanje objekta shranjujemo v datoteko z imenom 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);} } } 

Izhod:

 success 
prenesite ta primer serializacije

Primer deserializacije Java

Deserializacija je proces rekonstrukcije objekta iz serializiranega stanja. To je obratna operacija serializacije. Oglejmo si primer, kjer beremo podatke iz deserializiranega objekta.

Deserializacija je proces rekonstrukcije objekta iz serializiranega stanja. To je obratna operacija serializacije. Oglejmo si primer, kjer beremo podatke iz deserializiranega objekta.

matematične metode v Javi

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

Izhod:

211 ravi 
prenesite ta primer deserializacije

Serializacija Java z dedovanjem (razmerje IS-A)

Če razred izvaja Serializable vmesnik potem bo vse njegove podrazrede tudi mogoče serializirati. Oglejmo si spodnji primer:

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

Izhod:

 success 211 ravi Engineering 50000 

Razred SerializeISA je serializiral predmet razreda Student, ki razširja razred Person, ki je Serializable. Lastnosti nadrejenega razreda so podedovane v podrazrede, tako da če je nadrejeni razred Serializable, bi bil tudi podrazred.

Serializacija Java z združevanjem (razmerje HAS-A)

Če ima razred referenco na drug razred, morajo biti vse reference Serializable, sicer postopek serializacije ne bo izveden. V takem primeru NotSerializableException vrže med izvajanjem.

Naslov.java

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

Študent.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; } } 

Ker naslova ni mogoče serializirati, ne morete serializirati primerka razreda študenta.

Opomba: Vsi objekti v objektu morajo biti Serializable.

Serializacija Java s statičnim podatkovnim članom

Če je v razredu kakršen koli statični podatkovni član, ta ne bo serializiran, ker je statika del razreda in ne objekt.

volk ​​proti lisici

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

Serializacija Java z nizom ali zbirko

Pravilo: V primeru matrike ali zbirke mora biti vse objekte matrike ali zbirke mogoče serializirati. Če katerega koli objekta ni mogoče serializirati, serializacija ne bo uspela.

Možnost eksternalizacije v javi

Vmesnik Externalizable nudi možnost zapisovanja stanja objekta v tok bajtov v stisnjenem formatu. To ni označevalni vmesnik.

Vmesnik Externalizable nudi dva načina:

    public void writeExternal(ObjectOutput out) vrže IOException public void readExternal(ObjectInput in) vrže IOException

Ključna beseda Java Transient

Če ne želite serializirati nobenega podatkovnega člana razreda, ga lahko označite kot prehodnega.

Zaposleni.java

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

Zdaj id ne bo serializiran, tako da, ko deserializirate predmet po serializaciji, ne boste dobili vrednosti id. Vedno bo vrnil privzeto vrednost. V takem primeru bo vrnil 0, ker je podatkovni tip id celo število.

Za več podrobnosti obiščite naslednjo stran.

SerialVersionUID

Postopek serializacije v času izvajanja poveže ID z vsakim razredom Serializable, ki je znan kot SerialVersionUID. Uporablja se za preverjanje pošiljatelja in prejemnika serializiranega objekta. Pošiljatelj in prejemnik morata biti isti. Za preverjanje se uporablja SerialVersionUID. Pošiljatelj in prejemnik morata imeti isti SerialVersionUID, sicer InvalidClassException bo vržen, ko deserializirate predmet. V razredu Serializable lahko deklariramo tudi lasten SerialVersionUID. Če želite to narediti, morate ustvariti polje SerialVersionUID in mu dodeliti vrednost. Biti mora dolgega tipa s statično in končno. Priporočljivo je, da polje serialVersionUID izrecno deklarirate v razredu in ga postavite tudi kot zasebnega. Na primer:

 private static final long serialVersionUID=1L; 

Zdaj bo razred Serializable videti takole:

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