Serialisatie in Java

Serialisatie in Java is een mechanisme dat de status van een object omzet in een bytestream. Deserialisatie is het omgekeerde proces. Door deserialisatie, van een bytestroom, wordt het werkelijke Java-object in het geheugen gemaakt. Een dergelijk mechanisme houdt het object vast.

De bytestream die zo is gemaakt op basis van serialisatie, is niet afhankelijk van een platform. Het object dat op één platform is geserialiseerd, kan zonder probleem op elk ander platform worden gedeserialiseerd. Het gehele proces van serialisatie en deserialisatie is dus onafhankelijk van JVM.

Als een klasseobject geserialiseerd moet worden, moet men de interface java.io.Serializable implementeren. Serialiseerbaar in Java is een markerinterface. Het heeft geen velden of methoden om te implementeren. Een klasse wordt door dit proces serialiseerbaar gemaakt dat op een Opt-In-proces lijkt.

Serialisatie in Java wordt geïmplementeerd door de twee klassen ObjectInputStream en ObjectOutputStream.

Het enige dat nodig is, is een wrapper over hen zodat deze in een bestand kan worden opgeslagen of via een netwerk kan worden verzonden.

Het concept van serialisatie in Java

De klasse ObjectOutputStream, die de serialisatieklasse is zoals hierboven vermeld, bevat verschillende schrijfmethoden voor het schrijven van verschillende gegevenstypen, maar één methode is het populairst

public final void writeObject(Object x) throws IOException

De bovenstaande methode kan worden gebruikt om een ​​object te serialiseren. Deze methode verzendt deze ook naar de uitvoerstroom. Op dezelfde manier bevat de klasse ObjectInputStream de methode voor het deserialiseren van objecten

public final Object readObject() throws IOException, ClassNotFoundException

De deserialisatiemethode haalt het object uit een stream en deserialiseert hetzelfde. De geretourneerde waarde is weer een object, dus het enige dat nodig is, is deze naar het relevante gegevenstype casten.

Om een ​​klasse met succes te serialiseren, moet aan twee voorwaarden worden voldaan:

  • io. Serialiseerbare interface moet door de klasse worden geïmplementeerd.
  • Alle velden van de klasse moeten serienummerbaar zijn. Als zelfs één veld niet serialiseerbaar is, moet het als tijdelijk worden gemarkeerd.

Als iemand moet controleren of een klasse serienummerbaar is of niet, is de eenvoudige oplossing om te controleren of de klasse de methode java.io.Serializable implementeert. Als dit het geval is, is deze serienummerbaar als dit niet het geval is.

Men moet opmerken dat bij het serialiseren van een object naar een bestand, de standaardpraktijk is om het bestand een .ser-extensie te geven.

Wijze van serialisatie in Java

Als deze methoden aanwezig zijn in de klasse, worden ze gebruikt voor serialisatie in Java-doeleinden.

Methode Beschrijving
openbare finale void writeObject (Object obj) gooit IOException ()Hiermee wordt het opgegeven object naar de ObjectOutputStream geschreven.
public void flush () gooit IOException ()Hiermee wordt de huidige uitvoerstroom gespoeld.
public void close () gooit IOException ()Hiermee wordt de huidige uitvoerstroom gesloten.

Wijze van deserialisatie in Java

Methode Beschrijving
openbare finale Object readObject () gooit IOException, ClassNotFoundException ()Hiermee wordt een object uit de invoerstream gelezen.
public void close () gooit IOException ()Hiermee wordt ObjectInputStream gesloten.

Voorbeelden van serialisatie in Java

In deze sectie hebben we Serialisatie in Java met voorbeelden besproken.

Hier wordt een voorbeeld in Java gegeven om aan te tonen hoe serialisatie werkt in Java. We maken een Werknemersklasse om enkele functies te bestuderen en de code hiervoor wordt hieronder gegeven. Deze werknemersklasse implementeert de interface Serializable.

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

Wanneer dit programma wordt uitgevoerd, wordt een bestand met de naam employee.ser gemaakt. Dit programma biedt geen gegarandeerde output, het is alleen voor verklarende doeleinden en het doel is om het gebruik en de werking ervan te begrijpen.

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

Het hieronder beschreven DeserializeDemo-programma deserialiseert het bovenstaande werknemerobject dat is gemaakt in het Serialize Demo-programma .

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

De bovenstaande code geeft het volgende resultaat:

uitgang

Gedeserialiseerde werknemer …

Naam: Rahul Jain

Adres: epip, Bangalore

SSN: 0

Nummer: 131

Hieronder volgen enkele belangrijke punten met betrekking tot het programma hierboven -

  • Het try / catch-blok hierboven probeert een ClassNotFoundException te vangen. Dit wordt verklaard door de methode readObject ().
  • Een JVM kan een object deserialiseren, alleen als het de bytecode voor de klasse vindt.
  • Als de JVM geen klasse vindt tijdens de deserialisatie, wordt ClassNotFoundException gegenereerd.
  • de geretourneerde waarde van readObject () wordt altijd naar een werknemerreferentie gegoten.
  • SSN-veldwaarde was aanvankelijk 114433 toen het object werd geserialiseerd, maar deze waarde werd niet naar de uitvoerstroom verzonden. Om dezelfde reden is het gedeserialiseerde SSN-veldobject Werknemer 0.

Conclusie

Hierboven hebben we serialisatieconcepten geïntroduceerd en voorbeelden gegeven. Laten we de noodzaak van serialisatie begrijpen als onze slotopmerkingen.

  • Communicatie: Als twee machines waarop dezelfde code draait moeten communiceren, is de eenvoudige manier om te communiceren dat de ene machine een object moet bouwen met informatie die het zou verzenden, en dat object vervolgens serialiseren voordat het naar de andere machine wordt verzonden. Geen geweldige methode, maar het lukt wel.
  • Persistentie: als de bedrijfstoestand in een database moet worden opgeslagen, wordt deze eerst in serie omgezet naar een bytearray en vervolgens in de database opgeslagen voor later ophalen.
  • Diepe kopie: als een exacte replica van een object moet worden gemaakt en het schrijven van gespecialiseerde kloonklasse te veel werk is, dan zal het doel worden bereikt door alleen het object te serialiseren en vervolgens te de-serialiseren naar een ander object.
  • Cross JVM-synchronisatie: verschillende JVM's die op verschillende machines en architecturen worden uitgevoerd, kunnen worden gesynchroniseerd.

Aanbevolen artikelen

Dit is een handleiding voor serialisatie op Java geweest. Hier hebben we de verschillende methoden van serialisatie in Java met voorbeelden besproken. U kunt ook het volgende artikel bekijken voor meer informatie -

  1. Vragen tijdens solliciteren bij Java Developer
  2. Java-lijst versus matrixlijst
  3. Gebruik van JavaScript