Serializace v Javě

Serializace v Javě je mechanismus, který převádí stav objektu do bajtového proudu. Deserializace je zpětný proces. Prostřednictvím deserializace se z bajtového proudu v paměti vytvoří skutečný objekt Java. Takový mechanismus objekt přetrvává.

Takto vytvořený tok bajtů ze serializace nezávisí na žádné platformě. Objekt serializovaný na jedné platformě lze deserializovat na jakékoli jiné platformě bez problémů. Celý proces serializace a deserializace je tedy nezávislý na JVM.

Pokud má být objekt třídy serializován, je třeba implementovat rozhraní java.io.Serializable. Serializable in java je rozhraní značek. Nemá žádná pole ani metody implementovat. Třída je tímto procesem, který vypadá jako proces Opt-In, serializovatelná.

Serializaci v Javě implementují dvě třídy ObjectInputStream a ObjectOutputStream.

Vše, co je vyžadováno, je nad nimi obal, takže jej lze uložit do souboru nebo poslat přes síť.

Koncept serializace v Javě

Třída ObjectOutputStream, která je serializační třídou, jak je uvedeno ve výše uvedené části, obsahuje několik metod zápisu pro psaní různých datových typů, ale jedna metoda je nejoblíbenější

public final void writeObject(Object x) throws IOException

Výše uvedený způsob lze použít k serializaci objektu. Tato metoda jej také odešle do výstupního proudu. Třída ObjectInputStream stejným způsobem obsahuje metodu deserializace objektů

public final Object readObject() throws IOException, ClassNotFoundException

Metoda deserializace načte objekt z proudu a deserializuje jej. Návratová hodnota je opět objektem, takže vše, co je potřeba, je převést na příslušný datový typ.

Aby byla třída úspěšně serializována, musí být splněny dvě podmínky -

  • io. Serializovatelné rozhraní musí být implementováno třídou.
  • Všechna pole třídy musí být serializovatelná. Pokud ani jedno pole není serializovatelné, mělo by být označeno jako přechodné.

Pokud někdo potřebuje zkontrolovat, zda je třída serializovatelná nebo ne, jednoduchým řešením je zkontrolovat, zda třída implementuje metodu java.io.Serializable, pokud ano, je serializovatelná, pokud tomu tak není.

Jeden by si měl všimnout, že při serializaci objektu do souboru je standardní praxí dát souboru příponu .ser.

Metoda serializace v Javě

Pokud jsou tyto metody ve třídě přítomny, používají se pro účely serializace v Javě.

Metoda Popis
veřejné finální void writeObject (Object obj) vyvolá IOException ()Tím se zadaný objekt zapíše do ObjectOutputStream.
public void flush () vyvolá IOException ()Tím se vyprázdní aktuální výstupní proud.
public void close () vyvolá IOException ()Tím se uzavře aktuální výstupní proud.

Metoda deserializace v Javě

Metoda Popis
veřejný konečný objekt readObject () vyvolá IOException, ClassNotFoundException ()Tím se načte objekt ze vstupního proudu.
public void close () vyvolá IOException ()Tím zavřete ObjectInputStream.

Příklady serializace v Javě

V této části jsme diskutovali Serializaci v Javě s příklady.

Zde je uveden příklad v Javě, který demonstruje, jak serializace v Javě funguje. Vytváříme třídu zaměstnanců pro studium některých funkcí a níže uvedený kód je uveden. Tato třída zaměstnanců implementuje rozhraní 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);
)
)

Když bude tento program proveden s prováděním, bude vytvořen soubor s názvem zaměstnanec.server. Tento program neposkytuje zaručený výstup, ale slouží pouze pro vysvětlení a jeho cílem je porozumět jeho používání a fungování.

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

Níže popsaný program DeserializeDemo deserializuje výše uvedený objekt zaměstnance vytvořený v programu Serialize Demo .

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

Výše uvedený kód přinese následující výsledek -

Výstup

Deserializovaný zaměstnanec…

Jméno: Rahul Jain

Adresa: epip, Bangalore

SSN: 0

Číslo: 131

Níže jsou uvedeny některé důležité body související s výše uvedeným programem -

  • Blok try / catch výše se pokouší zachytit ClassNotFoundException. To je deklarováno metodou readObject ().
  • JVM může deserializovat objekt, pouze pokud najde bajtkód třídy.
  • Pokud JVM nenajde třídu během deserializace, vyvolá ClassNotFoundException.
  • návratová hodnota readObject () je vždy přenesena na odkaz zaměstnance.
  • Hodnota pole SSN byla 114433 zpočátku, když byl objekt serializován, ale protože tato hodnota nebyla odeslána do výstupního toku. Z tohoto důvodu je deserializovaný objekt pole SSN zaměstnance 0.

Závěr

Výše jsme představili koncepty serializace a poskytli příklady. Pojďme pochopit potřebu serializace jako naše závěrečné poznámky.

  • Komunikace: Pokud dva stroje, které používají stejný kód, musejí komunikovat snadným způsobem, je, že jeden stroj by měl postavit objekt obsahující informace, které by vyslal, a pak tento objekt před odesláním na druhý stroj serializovat. Není to skvělá metoda, ale dělá práci.
  • Perzistence: Pokud má být provozní stav uložen v databázi, je nejprve serializován do bajtového pole a poté uložen do databáze pro pozdější získání.
  • Hluboká kopie: Pokud je třeba vytvořit přesnou repliku objektu a psaní specializované klonové třídy je příliš tvrdá práce, pak pouhým serializováním objektu a následným de-serializací na jiný objekt dosáhne cíle.
  • Cross JVM Synchronization: různé JVM běžící na různých strojích a architekturách lze synchronizovat.

Doporučené články

Toto byl průvodce Serializací v Javě. Zde jsme diskutovali různé metody serializace v Javě s příklady. Další informace naleznete také v následujícím článku -

  1. Java Developer Interview Otázky
  2. Seznam Java vs Seznam polí
  3. Použití JavaScriptu

Kategorie: