logo

Serialisointi ja deserialisointi Javassa

  1. Sarjoittaminen
  2. Serialisoitava käyttöliittymä
  3. Esimerkki serialisoinnista
  4. Esimerkki deserialisoinnista
  5. Serialisointi perinnöllä
  6. Ulkoistettava käyttöliittymä
  7. Serialisointi ja staattisen datan jäsen

Serialisointi Javassa on mekanismi objektin tilan kirjoittaminen tavuvirtaan . Sitä käytetään pääasiassa Hibernate-, RMI-, JPA-, EJB- ja JMS-tekniikoissa.

Serialisoinnin käänteistä toimintaa kutsutaan deserialisointi jossa tavuvirta muunnetaan objektiksi. Sarjoitus- ja deserialisointiprosessi on alustasta riippumaton, mikä tarkoittaa, että voit sarjoittaa objektin yhdellä alustalla ja deserialisoida sen toisella alustalla.

Objektin sarjoittamista varten kutsumme writeObject() menetelmä ObjectOutputStream luokka, ja deserialisointia varten kutsumme readObject() menetelmä ObjectInputStream luokkaa.

Meidän on pantava täytäntöön Sarjasoitavissa käyttöliittymä objektin sarjoittamista varten.

Java-serialisoinnin edut

Sitä käytetään pääasiassa kohteen tilan liikkumiseen verkossa (eli järjestelynä).

java serialisointi

java.io.Serialisoitava käyttöliittymä

Sarjasoitavissa on merkkirajapinta (ei datajäsentä ja menetelmää). Sitä käytetään Java-luokkien 'merkitsemiseen', jotta näiden luokkien objektit voivat saada tietyn ominaisuuden. The Kloonattavissa ja Etä ovat myös merkkirajapintoja.

muuntaa merkkijonosta kokonaisluvuksi java

The Sarjasoitavissa rajapinta tulee toteuttaa sen luokan toimesta, jonka objektia on säilytettävä.

String-luokka ja kaikki kääreluokat toteuttavat java.io.Serialoitavissa käyttöliittymä oletuksena.

Katsotaanpa alla olevaa esimerkkiä:

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

Yllä olevassa esimerkissä Opiskelija luokka toteuttaa Serialisoitavan käyttöliittymän. Nyt sen esineet voidaan muuntaa virraksi. Pääluokan toteutus näytetään seuraavassa koodissa.

ObjectOutputStream-luokka

ObjectOutputStream-luokkaa käytetään primitiivisten tietotyyppien ja Java-objektien kirjoittamiseen OutputStreamiin. Virtoihin voidaan kirjoittaa vain objekteja, jotka tukevat java.io.Serializable-käyttöliittymää.

Rakentaja

1) julkinen ObjectOutputStream(OutputStream out) heittää IOExceptionin {}Se luo ObjectOutputStreamin, joka kirjoittaa määritettyyn OutputStreamiin.

Tärkeitä menetelmiä

MenetelmäKuvaus
1) public final void writeObject(Object obj) heittää IOExceptionin {}Se kirjoittaa määritetyn objektin ObjectOutputStreamiin.
2) public void flush() heittää IOExceptionin {}Se huuhtelee nykyisen lähtövirran.
3) public void close() heittää IOExceptionin {}Se sulkee nykyisen lähtövirran.

ObjectInputStream-luokka

ObjectInputStream deserialisoi objektit ja primitiiviset tiedot, jotka on kirjoitettu ObjectOutputStreamin avulla.

Rakentaja

1) julkinen ObjectInputStream(InputStream in) heittää IOExceptionin {}Se luo ObjectInputStreamin, joka lukee määritetystä InputStreamista.

Tärkeitä menetelmiä

MenetelmäKuvaus
1) julkinen lopullinen Object readObject() heittää IOExceptionin, ClassNotFoundExceptionin{}Se lukee objektin tulovirrasta.
2) public void close() heittää IOExceptionin {}Se sulkee ObjectInputStreamin.

Esimerkki Java-serialisoinnista

Tässä esimerkissä aiomme sarjoittaa kohteen Opiskelija luokka yllä olevasta koodista. ObjectOutputStream-luokan writeObject()-metodi tarjoaa toiminnot objektin sarjoittamiseksi. Tallennamme objektin tilan tiedostoon nimeltä f.txt.

talviunen murre

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

Lähtö:

 success 
lataa tämä serialisointiesimerkki

Esimerkki Java Deserialization

Deserialisointi on prosessi, jossa objekti rekonstruoidaan serialisoidusta tilasta. Se on serialisoinnin käänteinen toiminta. Katsotaanpa esimerkkiä, jossa luemme tietoja deserialisoidusta objektista.

Deserialisointi on prosessi, jossa objekti rekonstruoidaan serialisoidusta tilasta. Se on serialisoinnin käänteinen toiminta. Katsotaanpa esimerkkiä, jossa luemme tietoja deserialisoidusta objektista.

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

Lähtö:

211 ravi 
lataa tämä esimerkki deserialisoinnista

Java-serialisointi perinnöllä (IS-A-suhde)

Jos luokka toteuttaa Serialisoitava käyttöliittymä silloin kaikki sen alaluokat ovat myös sarjoitettavissa. Katsotaanpa alla olevaa esimerkkiä:

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

Lähtö:

 success 211 ravi Engineering 50000 

SerializeISA-luokka on sarjoittanut Student-luokkaobjektin, joka laajentaa serialoitavaa Person-luokkaa. Pääluokan ominaisuudet periytyvät alaluokille, joten jos emoluokka on Serialisoitava, myös alaluokka olisi.

Java-serialisointi ja yhdistäminen (HAS-A-suhde)

Jos luokassa on viittaus toiseen luokkaan, kaikkien viittausten on oltava serialoitavia, muuten sarjointiprosessia ei suoriteta. Siinä tapauksessa, NotSerializableException heitetään ajon aikana.

java swing

Osoite.java

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

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

Koska osoite ei ole serialoitavissa, opiskelija-luokan esiintymää ei voi sarjottaa.

Huomautus: Kaikkien objektin sisällä olevien objektien on oltava sarjoitettavissa.

Java-serialisointi staattisen datajäsenen kanssa

Jos luokassa on jokin staattinen datajäsen, sitä ei sarjoiteta, koska staattinen on luokan osa, ei objekti.

Työntekijä.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-serialisointi taulukon tai kokoelman kanssa

Sääntö: Kun kyseessä on taulukko tai kokoelma, kaikkien taulukon tai kokoelman objektien on oltava sarjoitettavissa. Jos jokin objekti ei ole sarjoitettavissa, serialisointi epäonnistuu.

Ulkoistettavissa javassa

Ulkoistettava käyttöliittymä tarjoaa mahdollisuuden kirjoittaa objektin tila tavuvirtaan pakkausmuodossa. Se ei ole merkkirajapinta.

Ulkoistettava käyttöliittymä tarjoaa kaksi tapaa:

    public void writeExternal(ObjectOutput out) heittää IOExceptionin public void readExternal(ObjectInput in) heittää IOExceptionin

Java ohimenevä avainsana

Jos et halua sarjottaa mitään luokan datajäsentä, voit merkitä sen ohimeneväksi.

Työntekijä.java

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

Nyt id:tä ei serialisoida, joten kun deserialoit objektin sarjoituksen jälkeen, et saa id:n arvoa. Se palauttaa aina oletusarvon. Siinä tapauksessa se palauttaa 0:n, koska id:n tietotyyppi on kokonaisluku.

Vieraile seuraavalla sivulla saadaksesi lisätietoja.

SerialVersionUID

Serialisointiprosessi ajon aikana liittää tunnuksen jokaiseen Serialisoitavaan luokkaan, joka tunnetaan nimellä SerialVersionUID. Sitä käytetään sarjoitetun objektin lähettäjän ja vastaanottajan tarkistamiseen. Lähettäjän ja vastaanottajan on oltava sama. Sen tarkistamiseen käytetään SerialVersionUID:tä. Lähettäjällä ja vastaanottajalla on oltava sama SerialVersionUID, muuten InvalidClassException heitetään, kun sarjoit esineen. Voimme myös ilmoittaa oman SerialVersionUID-tunnuksemme Serializable-luokassa. Tätä varten sinun on luotava kenttä SerialVersionUID ja määritettävä sille arvo. Sen on oltava pitkää tyyppiä, staattista ja lopullista. On suositeltavaa ilmoittaa serialVersionUID-kenttä luokassa ja pitää se myös yksityisenä. Esimerkiksi:

 private static final long serialVersionUID=1L; 

Nyt Serialisable-luokka näyttää tältä:

Työntekijä.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; } }