- Serialisering
- Serialiserbar grænseflade
- Eksempel på serialisering
- Eksempel på deserialisering
- Serialisering med arv
- Eksternaliserbar grænseflade
- 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.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
Metode | Beskrivelse |
---|---|
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
Metode | Beskrivelse |
---|---|
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:
successdownload 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 ravidownload 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:
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; } }