logo

Serialisering og deserialisering i Java

  1. Serialisering
  2. Serialiserbar grænseflade
  3. Eksempel på serialisering
  4. Eksempel på deserialisering
  5. Serialisering med arv
  6. Eksternaliserbar grænseflade
  7. Serialisering og statisk data medlem

Serialisering i Java er en mekanisme af at skrive et objekts tilstand ind i en byte-stream . Det bruges hovedsageligt i Hibernate-, RMI-, JPA-, EJB- og JMS-teknologier.

Den omvendte operation af serialisering kaldes deserialisering hvor byte-stream konverteres til et objekt. Serialiserings- og deserialiseringsprocessen er platformsuafhængig, det betyder, at du kan serialisere et objekt på én platform og deserialisere det på en anden platform.

For at serialisere objektet kalder vi skriveObject() metode til ObjectOutputStream klasse, og til deserialisering kalder vi for readObject() metode til ObjectInputStream klasse.

Vi skal have implementeret Serialiserbar interface til at serialisere objektet.

b+ træ

Fordele ved Java-serialisering

Det bruges hovedsageligt til at rejse objektets tilstand på netværket (det er kendt som rangering).

java serialisering

java.io.Serialiserbar grænseflade

Serialiserbar er en markørgrænseflade (har intet datamedlem og metode). Det bruges til at 'mærke' Java-klasser, så objekterne i disse klasser kan få en vis kapacitet. Det Kan klones og Fjern er også markørgrænseflader.

Det Serialiserbar grænsefladen skal implementeres af den klasse, hvis objekt skal bevares.

String-klassen og alle wrapper-klasserne implementerer java.io.Serialiserbar interface som standard.

Lad os se eksemplet 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 ovenstående eksempel, Studerende klasse implementerer Serialisable grænseflade. Nu kan dens objekter konverteres til stream. Hovedklasseimplementeringen af ​​er vist i den næste kode.

ObjectOutputStream klasse

ObjectOutputStream-klassen bruges til at skrive primitive datatyper, og Java-objekter til en OutputStream. Kun objekter, der understøtter java.io.Serializable-grænsefladen, kan skrives til streams.

scan.nextstring java

Konstruktør

1) public ObjectOutputStream(OutputStream out) kaster IOException {}Det opretter en ObjectOutputStream, der skriver til den angivne OutputStream.

Vigtige metoder

MetodeBeskrivelse
1) public final void writeObject(Object obj) kaster IOException {}Den skriver det angivne objekt til ObjectOutputStream.
2) public void flush() kaster IOException {}Det skyller den aktuelle udgangsstrøm.
3) public void close() kaster IOException {}Det lukker den aktuelle udgangsstrøm.

ObjectInputStream klasse

En ObjectInputStream deserialiserer objekter og primitive data skrevet ved hjælp af en ObjectOutputStream.

Konstruktør

1) public ObjectInputStream(InputStream in) kaster IOException {}Den opretter en ObjectInputStream, der læser fra den angivne InputStream.

Vigtige metoder

MetodeBeskrivelse
1) public final Object readObject() kaster IOException, ClassNotFoundException{}Den læser et objekt fra inputstrømmen.
2) public void close() kaster IOException {}Det lukker ObjectInputStream.

Eksempel på Java-serialisering

I dette eksempel skal vi serialisere genstanden for Studerende klasse fra ovenstående kode. WriteObject()-metoden i klassen ObjectOutputStream giver funktionaliteten til at serialisere objektet. Vi gemmer objektets tilstand i filen med navnet 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);} } } 

Produktion:

 success 
download dette eksempel på serialisering

Eksempel på Java-deserialisering

Deserialisering er processen med at rekonstruere objektet fra den serialiserede tilstand. Det er den omvendte operation af serialisering. Lad os se et eksempel, hvor vi læser data fra et deserialiseret objekt.

nick pulos sort lyn

Deserialisering er processen med at rekonstruere objektet fra den serialiserede tilstand. Det er den omvendte operation af serialisering. Lad os se et eksempel, hvor vi læser data fra et deserialiseret 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);} } } 

Produktion:

211 ravi 
download dette eksempel på deserialisering

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

Hvis en klasse implementerer Serialiserbar grænseflade så vil alle dens underklasser også kunne serialiseres. Lad os se eksemplet 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);} } } 

Produktion:

 success 211 ravi Engineering 50000 

SerializeISA-klassen har serialiseret Student-klasseobjektet, der udvider Person-klassen, som kan serialiseres. Overordnede klasseegenskaber nedarves til underklasser, så hvis overordnede klasse kan serialiseres, ville underklassen også være det.

Java-serialisering med aggregation (HAS-A-relation)

Hvis en klasse har en reference til en anden klasse, skal alle referencerne kunne serialiseres, ellers vil serialiseringsprocessen ikke blive udført. I så fald NotSerializableException kastes under kørsel.

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

modstridende søgning
 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; } } 

Da Adresse ikke kan serialiseres, kan du ikke serialisere forekomsten af ​​elevklassen.

Bemærk: Alle objekter i et objekt skal kunne serialiseres.

Java-serialisering med det statiske datamedlem

Hvis der er et statisk datamedlem i en klasse, bliver det ikke serialiseret, fordi statisk er den del af klassen, der 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: I tilfælde af array eller samling skal alle objekter i array eller samling kunne serialiseres. Hvis et objekt ikke kan serialiseres, mislykkes serialiseringen.

gyldige identifikatorer i java

Eksternaliserbar i java

Den eksternaliserbare grænseflade giver mulighed for at skrive et objekts tilstand ind i en bytestrøm i komprimeret format. Det er ikke en markørgrænseflade.

Den eksternaliserbare grænseflade giver to metoder:

    public void writeExternal(ObjectOutput ud) kaster IOException public void readExternal(ObjectInput ind) kaster IOException

Java Transient søgeord

Hvis du ikke ønsker at serialisere noget datamedlem af en klasse, kan du markere 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; } } 

Nu vil id ikke blive serialiseret, så når du deserialiserer objektet efter serialisering, får du ikke værdien af ​​id. Det vil altid returnere standardværdien. I sådanne tilfælde vil det returnere 0, fordi datatypen for id er et heltal.

Besøg næste side for flere detaljer.

SerialVersionUID

Serialiseringsprocessen ved runtime knytter et id til hver Serializable-klasse, som er kendt som SerialVersionUID. Det bruges til at bekræfte afsenderen og modtageren af ​​det serialiserede objekt. Afsender og modtager skal være den samme. For at verificere det, bruges SerialVersionUID. Afsender og modtager skal have samme SerialVersionUID, ellers InvalidClassException vil blive kastet, når du deserialiserer objektet. Vi kan også erklære vores eget SerialVersionUID i klassen Serializable. For at gøre det skal du oprette et felt SerialVersionUID og tildele en værdi til det. Det skal være af den lange type med statisk og endelig. Det foreslås eksplicit at erklære feltet serialVersionUID i klassen og også have det privat. For eksempel:

 private static final long serialVersionUID=1L; 

Nu vil Serializable-klassen se sådan ud:

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