logo

Serialisering och deserialisering i Java

  1. Serialisering
  2. Serialiserbart gränssnitt
  3. Exempel på serialisering
  4. Exempel på deserialisering
  5. Serialisering med arv
  6. Externaliserbart gränssnitt
  7. Serialisering och statisk datamedlem

Serialisering i Java är en mekanism av att skriva ett objekts tillstånd till en byteström . Den används främst i Hibernate-, RMI-, JPA-, EJB- och JMS-teknologier.

Den omvända operationen av serialisering kallas deserialisering där byte-ström omvandlas till ett objekt. Serialiserings- och deserialiseringsprocessen är plattformsoberoende, det betyder att du kan serialisera ett objekt på en plattform och deserialisera det på en annan plattform.

För att serialisera objektet kallar vi writeObject() metod av ObjectOutputStream klass, och för deserialisering kallar vi readObject() metod av ObjectInputStream klass.

Vi måste genomföra Serialiserbar gränssnitt för att serialisera objektet.

Fördelar med Java Serialization

Det används främst för att resa objektets tillstånd på nätverket (som kallas rangering).

java serialisering

java.io.Serialiserbart gränssnitt

Serialiserbar är ett markörgränssnitt (har ingen datamedlem och metod). Den används för att 'märka' Java-klasser så att objekten i dessa klasser kan få en viss förmåga. De Klonbar och Avlägsen är också markörgränssnitt.

De Serialiserbar gränssnittet måste implementeras av klassen vars objekt måste bestå.

String-klassen och alla omslagsklasser implementerar java.io.Serialiserbar gränssnitt som standard.

Låt oss se exemplet nedan:

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 exemplet ovan, Studerande klass implementerar Serialiserbart gränssnitt. Nu kan dess föremål omvandlas till stream. Huvudklassimplementeringen av visas i nästa kod.

ObjectOutputStream-klassen

Klassen ObjectOutputStream används för att skriva primitiva datatyper och Java-objekt till en OutputStream. Endast objekt som stöder java.io.Serializable-gränssnittet kan skrivas till strömmar.

konvertering av int till sträng i java

Konstruktör

1) public ObjectOutputStream(OutputStream out) kastar IOException {}Den skapar en ObjectOutputStream som skriver till den angivna OutputStream.

Viktiga metoder

MetodBeskrivning
1) public final void writeObject(Object obj) kastar IOException {}Den skriver det angivna objektet till ObjectOutputStream.
2) public void flush() kastar IOException {}Den spolar den aktuella utströmmen.
3) public void close() kastar IOException {}Den stänger den aktuella utströmmen.

ObjectInputStream-klassen

En ObjectInputStream avserialiserar objekt och primitiva data skrivna med hjälp av en ObjectOutputStream.

Konstruktör

1) public ObjectInputStream(InputStream in) kastar IOException {}Den skapar en ObjectInputStream som läser från den angivna InputStream.

Viktiga metoder

MetodBeskrivning
1) public final Object readObject() kastar IOException, ClassNotFoundException{}Den läser ett objekt från inmatningsströmmen.
2) public void close() kastar IOException {}Den stänger ObjectInputStream.

Exempel på Java Serialization

I det här exemplet kommer vi att serialisera föremålet för Studerande klass från ovanstående kod. Metoden writeObject() i klassen ObjectOutputStream tillhandahåller funktionen för att serialisera objektet. Vi sparar objektets tillstånd i filen f.txt.

Fortsätt.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 
ladda ner det här exemplet på serialisering

Exempel på Java-deserialisering

Deserialisering är processen att rekonstruera objektet från det serialiserade tillståndet. Det är den omvända operationen av serialisering. Låt oss se ett exempel där vi läser data från ett deserialiserat objekt.

Deserialisering är processen att rekonstruera objektet från det serialiserade tillståndet. Det är den omvända operationen av serialisering. Låt oss se ett exempel där vi läser data från ett deserialiserat 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 
ladda ner det här exemplet på deserialisering

Java Serialization with Inheritance (IS-A Relationship)

Om en klass implementerar Serialiserbart gränssnitt då kommer alla dess underklasser också att kunna serialiseras. Låt oss se exemplet nedan:

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

Klassen SerializeISA har serialiserat klassobjektet Student som utökar klassen Person som kan serialiseras. Egenskaper för överordnad klass ärvs till underklasser, så om överordnad klass kan serialiseras, skulle underklass också vara det.

Java Serialization with Aggregation (HAS-A Relationship)

Om en klass har en referens till en annan klass måste alla referenser kunna serialiseras annars kommer serialiseringsprocessen inte att utföras. I sådant fall, NotSerializableException kastas under körning.

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

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

Eftersom Adress inte kan serialiseras kan du inte serialisera instansen av klassen Student.

Obs: Alla objekt i ett objekt måste kunna serialiseras.

Java Serialisering med statisk datamedlem

Om det finns någon statisk datamedlem i en klass kommer den inte att serialiseras eftersom statisk är den del av klassen som inte är 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: Vid array eller samling måste alla objekt i array eller samling kunna serialiseras. Om något objekt inte går att serialisera kommer serialiseringen att misslyckas.

Externaliserbar i java

Det externa gränssnittet ger möjlighet att skriva ett objekts tillstånd till en byteström i komprimerat format. Det är inte ett markörgränssnitt.

Det externa gränssnittet erbjuder två metoder:

    public void writeExternal(ObjectOutput ut) kastar IOException public void readExternal(ObjectInput in) kastar IOException

Java Transient nyckelord

Om du inte vill serialisera någon datamedlem i en klass kan du markera den som övergå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 kommer id inte att serialiseras, så när du deserialiserar objektet efter serialisering får du inte värdet av id. Det kommer alltid att returnera standardvärdet. I sådana fall kommer den att returnera 0 eftersom datatypen för id är ett heltal.

Besök nästa sida för mer information.

SerialVersionUID

Serialiseringsprocessen vid körning associerar ett ID med varje Serialiserbar klass som är känd som SerialVersionUID. Den används för att verifiera avsändaren och mottagaren av det serialiserade objektet. Avsändaren och mottagaren måste vara samma. För att verifiera det används SerialVersionUID. Avsändaren och mottagaren måste ha samma SerialVersionUID, annars, InvalidClassException kommer att kastas när du deserialiserar objektet. Vi kan också deklarera vårt eget SerialVersionUID i klassen Serializable. För att göra det måste du skapa ett fält SerialVersionUID och tilldela ett värde till det. Den ska vara av den långa typen med statisk och slutlig. Det föreslås att explicit deklarera fältet serialVersionUID i klassen och även ha det privat. Till exempel:

java int som sträng
 private static final long serialVersionUID=1L; 

Nu kommer klassen Serializable se ut så här:

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