logo

Serialisering og deserialisering i Java

  1. Serialisering
  2. Serialiserbart grensesnitt
  3. Eksempel på serialisering
  4. Eksempel på deserialisering
  5. Serialisering med arv
  6. Eksternaliserbart grensesnitt
  7. Serialisering og statisk datamedlem

Serialisering i Java er en mekanisme av skrive tilstanden til et objekt inn i en byte-strøm . Den brukes hovedsakelig i Hibernate-, RMI-, JPA-, EJB- og JMS-teknologier.

Omvendt operasjon av serialisering kalles deserialisering hvor byte-stream konverteres til et objekt. Serialiserings- og deserialiseringsprosessen er plattformuavhengig, det betyr at du kan serialisere et objekt på én plattform og deserialisere det på en annen plattform.

For å serialisere objektet kaller vi skriveobjekt() Metode av ObjectOutputStream klasse, og for deserialisering kaller vi readObject() Metode av ObjectInputStream klasse.

Vi må implementere Serialiserbar grensesnitt for serialisering av objektet.

java tilfeldig tallgenerator

Fordeler med Java-serialisering

Den brukes hovedsakelig til å reise objektets tilstand på nettverket (som er kjent som rangering).

java serialisering

java.io.Serialiserbart grensesnitt

Serialiserbar er et markørgrensesnitt (har ikke noe datamedlem og metode). Den brukes til å 'merke' Java-klasser slik at objektene til disse klassene kan få en viss evne. De Klonbar og Fjernkontroll er også markørgrensesnitt.

De Serialiserbar grensesnittet må implementeres av klassen hvis objekt må vedvares.

String-klassen og alle wrapper-klassene implementerer java.io.Serialiserbar grensesnitt som standard.

La oss se eksemplet gitt nedenfor:

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

I eksemplet ovenfor, Student klasse implementerer serialiserbart grensesnitt. Nå kan objektene konverteres til strøm. Hovedklassens implementering av er vist i neste kode.

ObjectOutputStream-klassen

ObjectOutputStream-klassen brukes til å skrive primitive datatyper, og Java-objekter til en OutputStream. Bare objekter som støtter java.io.Serializable-grensesnittet kan skrives til strømmer.

algebra av sett

Konstruktør

1) public ObjectOutputStream(OutputStream out) kaster IOException {}Den lager en ObjectOutputStream som skriver til den spesifiserte OutputStream.

Viktige metoder

MetodeBeskrivelse
1) public final void writeObject(Object obj) kaster IOException {}Den skriver det angitte objektet til ObjectOutputStream.
2) public void flush() kaster IOException {}Den spyler den gjeldende utgangsstrømmen.
3) public void close() kaster IOException {}Den lukker gjeldende utgangsstrøm.

ObjectInputStream-klassen

En ObjectInputStream deserialiserer objekter og primitive data skrevet ved hjelp av en ObjectOutputStream.

Konstruktør

1) public ObjectInputStream(InputStream in) kaster IOException {}Den lager en ObjectInputStream som leser fra den angitte InputStream.

Viktige metoder

MetodeBeskrivelse
1) public final Object readObject() kaster IOException, ClassNotFoundException{}Den leser et objekt fra inndatastrømmen.
2) public void close() kaster IOException {}Den lukker ObjectInputStream.

Eksempel på Java-serialisering

I dette eksemplet skal vi serialisere objektet til Student klasse fra ovenstående kode. WriteObject()-metoden til ObjectOutputStream-klassen gir funksjonaliteten til å serialisere objektet. Vi lagrer tilstanden til objektet i filen som heter 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);} } } 

Produksjon:

 success 
last ned dette eksemplet på serialisering

Eksempel på Java-deserialisering

Deserialisering er prosessen med å rekonstruere objektet fra den serialiserte tilstanden. Det er omvendt operasjon av serialisering. La oss se et eksempel der vi leser data fra et deserialisert objekt.

nick pulos svart lyn

Deserialisering er prosessen med å rekonstruere objektet fra den serialiserte tilstanden. Det er omvendt operasjon av serialisering. La oss se et eksempel der vi leser data fra et deserialisert objekt.

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

Produksjon:

211 ravi 
last ned dette eksemplet på deserialisering

Java-serialisering med arv (IS-A-forhold)

Hvis en klasse implementerer Serialiserbart grensesnitt da vil alle underklassene også kunne serialiseres. La oss se eksemplet gitt nedenfor:

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

Produksjon:

 success 211 ravi Engineering 50000 

SerializeISA-klassen har serialisert Student-klasseobjektet som utvider Person-klassen som kan serialiseres. Overordnede klasseegenskaper arves til underklasser, så hvis overordnet klasse kan serialiseres, vil underklassen også være det.

Java-serialisering med aggregasjon (HAS-A-forhold)

Hvis en klasse har en referanse til en annen klasse, må alle referansene være serialiserbare ellers vil ikke serialiseringsprosessen bli utført. I så fall, NotSerializableException kastes under kjøring.

Adresse.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

motstridende søk
 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; } } 

Siden Adresse ikke kan serialiseres, kan du ikke serialisere forekomsten av Student-klassen.

Merk: Alle objektene i et objekt må kunne serialiseres.

Java-serialisering med det statiske datamedlemmet

Hvis det er et statisk datamedlem i en klasse, vil det ikke bli serialisert fordi statisk er delen av klassen som ikke er objekt.

Employee.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-serialisering med array eller samling

Regel: Ved array eller samling må alle objektene i array eller samling være serialiserbare. Hvis et objekt ikke kan serialiseres, vil serialisering mislykkes.

fjern første tegn i Excel

Eksternaliserbar i java

Det eksternaliserbare grensesnittet gir mulighet for å skrive tilstanden til et objekt inn i en bytestrøm i komprimert format. Det er ikke et markørgrensesnitt.

Det eksternaliserbare grensesnittet tilbyr to metoder:

    public void writeExternal(ObjectOutput ut) kaster IOException public void readExternal(ObjectInput inn) kaster IOException

Java Transient nøkkelord

Hvis du ikke vil serialisere noe datamedlem i en klasse, kan du merke det som forbigående.

Employee.java

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

Nå vil ikke id serialiseres, så når du deserialiserer objektet etter serialisering, vil du ikke få verdien av id. Den vil alltid returnere standardverdien. I slike tilfeller vil den returnere 0 fordi datatypen id er et heltall.

Gå til neste side for mer informasjon.

SerialVersionUID

Serialiseringsprosessen ved kjøretid knytter en id til hver serialiserbare klasse som er kjent som SerialVersionUID. Den brukes til å bekrefte avsender og mottaker av det serialiserte objektet. Avsender og mottaker må være den samme. For å bekrefte det, brukes SerialVersionUID. Avsender og mottaker må ha samme SerialVersionUID, ellers InvalidClassException vil bli kastet når du deserialiserer objektet. Vi kan også deklarere vår egen SerialVersionUID i klassen Serializable. For å gjøre det, må du opprette et felt SerialVersionUID og tilordne en verdi til det. Den skal være av den lange typen med statisk og endelig. Det foreslås å eksplisitt deklarere serialVersionUID-feltet i klassen og også ha det privat. For eksempel:

 private static final long serialVersionUID=1L; 

Nå vil Serializable-klassen se slik ut:

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