- Serializacija
- Serializable vmesnik
- Primer serializacije
- Primer deserializacije
- Serializacija z dedovanjem
- Zunanji vmesnik
- 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.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
Metoda | Opis |
---|---|
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
Metoda | Opis |
---|---|
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:
successprenesite 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 raviprenesite 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:
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; } }