Serialisering i Java

Serialisering i Java är en mekanism som konverterar ett objekts tillstånd till en byte-ström. Deserialisering är dess omvända process. Genom deserialisering, från en byte-ström, skapas faktiska Java-objekt i minnet. En sådan mekanism kvarstår föremålet.

Byte-strömmen som skapats genom serialisering beror inte på någon plattform. Objektet som är serialiserat på en plattform kan deserialiseras på vilken annan plattform som helst utan problem. Således är hela processen för serialisering och deserialisering JVM-oberoende.

Om ett klassobjekt ska serialiseras måste man implementera java.io.Serializable-gränssnittet. Serialiserbar i java är ett markörgränssnitt. Det har inga fält eller metoder att implementera. En klass görs seriebar med denna process som ser ut som en opt-in-process.

Serialisering i Java implementeras av de två klasserna ObjectInputStream och ObjectOutputStream.

Allt som krävs är en omslag över dem så att den kan sparas till fil eller kan skickas över ett nätverk.

Begreppet serialisering i Java

Klassen ObjectOutputStream, som är klassificeringsklass som nämnts ovan, innehåller flera skrivmetoder för att skriva olika datatyper, men en metod är mest populär

public final void writeObject(Object x) throws IOException

Ovanstående metod kan användas för att serialisera ett objekt. Denna metod skickar den också till utgångsströmmen. På samma sätt innehåller klassen ObjectInputStream metoden för att deserialisera objekt

public final Object readObject() throws IOException, ClassNotFoundException

Deserialiseringsmetoden hämtar objektet från en ström och deserialiserar detsamma. Återvändningsvärdet är återigen ett objekt, så allt som behövs är att kasta det till relevant datatyp.

För att en klass ska kunna framgångsrikt serialiseras finns det två villkor som måste uppfyllas -

  • io. Serialiserbart gränssnitt måste implementeras av klassen.
  • Alla fält i klassen måste vara serialiserbara. Om till och med ett fält inte kan serialiseras, bör det markeras övergående.

Om någon behöver kontrollera om en klass är serialiserbar eller inte, är den enkla lösningen att kontrollera om klassen implementerar java.io.Serializable-metoden, om den gör det så är den serialiserbar om den inte är den inte.

Man bör märka att när man serielliserar ett objekt till en fil, är det vanligt att ge filen en .ser-förlängning.

Metod för serialisering i Java

Om dessa metoder finns i klassen, används de för serialisering i Java-syften.

Metod Beskrivning
public final void writeObject (Object obj) kastar IOException ()Detta kommer att skriva det angivna objektet till ObjectOutputStream.
public void flush () kastar IOException ()Detta spolar den nuvarande utgångsströmmen.
public void close () kastar IOException ()Detta stänger den nuvarande utgångsströmmen.

Metod för deserialisering i Java

Metod Beskrivning
public final Objekt readObject () kastar IOException, ClassNotFoundException ()Detta kommer att läsa ett objekt från inmatningsströmmen.
public void close () kastar IOException ()Detta stänger ObjectInputStream.

Exempel på serialisering i Java

I det här avsnittet har vi diskuterat Serialisering i Java med exempel.

Ett exempel i Java tillhandahålls här för att demonstrera hur serialisering fungerar i Java. Vi skapar en anställdsklass för att studera några funktioner och koden för samma anges nedan. Denna anställdsklass implementerar det serialiserbara gränssnittet.

public class Employee implements java.io.Serializable (
public String name;
public String address;
public transient int SSN;
public int number;
public void mailCheck() (
System.out.println("Mailing a letter to " + name + " " + address);
)
)

När detta program kommer att utföras med exekvering skapas en fil med namnet medarbetare. Detta program tillhandahåller inte en garanterad utgång, utan är bara för förklarande syften och syftet är att förstå dess användning och fungera.

import java.io.*;
public class SerializeDemo (
public static void main(String () args) (
Employee e = new Employee();
e.name = "Rahul Jain";
e.address = "epip, Bangalore";
e.SSN = 114433;
e.number = 131;
try (
FileOutputStream fileOut =
new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized data saved in /tmp/employee.ser");
) catch (IOException i) (
i.printStackTrace();
)
)
)

Nedan beskrivna DeserializeDemo-program deserialiserar ovanstående Medarbetarobjekt skapat i Serialize Demo-programmet .

import java.io.*;
public class DeserializeDemo (
public static void main(String () args) (
Employee e = null;
try (
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
) catch (IOException i) (
i.printStackTrace();
return;
) catch (ClassNotFoundException c) (
System.out.println("Employee class is not found");
c.printStackTrace();
return;
)
System.out.println("Deserialized Employee…");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN);
System.out.println("Number: " + e.number);
)
)

Ovanstående kod ger följande resultat -

Produktion

Deserialiserad anställd …

Namn: Rahul Jain

Adress: epip, Bangalore

SSN: 0

Antal: 131

Några viktiga punkter relaterade till programmet ovan finns nedan -

  • Tryck / fångstblocket ovan försöker fånga en ClassNotFoundException. Detta deklareras med readObject () -metoden.
  • En JVM kan deserialisera ett objekt endast om den hittar bytkoden för klassen.
  • Om JVM inte hittar en klass under deserialiseringen kommer det att kasta ClassNotFoundException.
  • returvärdet för readObject () kastas alltid till en anställdsreferens.
  • SSN-fältvärdet var 114433 initialt när objektet serialiserades, men eftersom detta värde inte skickades till utgångsströmmen. På grund av samma sak är det deserialiserade SSN-fältobjektet 0.

Slutsats

Ovan introducerade vi seriekoncept och gav exempel. Låt oss förstå behovet av serialisering som våra avslutande kommentarer.

  • Kommunikation: Om två maskiner som kör samma kod måste kommunicera den enkla vägen är att en maskin ska bygga ett objekt som innehåller information som det skulle överföra och sedan serialisera det objektet innan det skickas till den andra maskinen. Inte en bra metod, men får jobbet gjort.
  • Persistens: Om drifttillståndet ska lagras i en databas, serialiseras det först till en byte-array och lagras sedan i databasen för hämtning vid en senare tidpunkt.
  • Djup kopia: Om en exaktreplika av ett objekt behöver skapas och att skriva specialiserad klonklass är för mycket hårt arbete, kommer det att uppnå målet genom att bara serialisera objektet och sedan de-serialisera det till ett annat objekt.
  • Cross JVM-synkronisering: olika JVM: er som körs på olika maskiner och arkitekturer kan synkroniseras.

Rekommenderade artiklar

Detta har varit en guide till serialisering i Java. Här har vi diskuterat de olika metoderna för serialisering i Java med exempel. Du kan också titta på följande artikel för att lära dig mer -

  1. Java-utvecklingsintervjufrågor
  2. Java List vs Array List
  3. Användning av JavaScript

Kategori: