Serializace je mechanismus převodu stavu objektu na byte stream. Deserializace je zpětný proces, kdy se bajtový proud používá k opětovnému vytvoření skutečného objektu Java v paměti. Tento mechanismus se používá k zachování objektu.
Vytvořený byte stream je nezávislý na platformě. Takže objekt serializovaný na jedné platformě může být deserializován na jiné platformě. Aby byl objekt Java serializovatelný, implementujeme java.io.Serializovatelný rozhraní. Třída ObjectOutputStream obsahuje writeObject() metoda pro serializaci objektu.
public final void writeObject(Object obj) throws IOException>
Třída ObjectInputStream obsahuje readObject() metoda deserializace objektu.
public final Object readObject() throws IOException, ClassNotFoundException>
Výhody serializace
- Uložení/přetrvání stavu objektu.
- Cestování objektem po síti.
Serializovat lze pouze objekty těch tříd, které se implementují java.io.Serializovatelný rozhraní. Serializovatelný je a rozhraní značky (nemá žádný datový člen a metodu). Používá se k označení tříd java, takže objekty těchto tříd mohou získat určitou schopnost. Další příklady rozhraní markerů jsou: - Cloneable a Remote.
Body k zapamatování
1. Pokud nadřazená třída implementovala rozhraní Serializable, potom jej podřízená třída implementovat nemusí, ale naopak to neplatí.
2. Prostřednictvím procesu serializace se ukládají pouze nestatické datové členy.
3. Statické datové členy a přechodné datové členy se neukládají prostřednictvím procesu serializace. Pokud tedy nechcete uložit hodnotu nestatického datového členu, udělejte jej přechodným.
4. Konstruktor objektu není nikdy volán, když je objekt deserializován.
5. Přidružené objekty musí implementovat serializovatelné rozhraní. Příklad:
class A implements Serializable{ // B also implements Serializable // interface. B ob=new B(); }>
SerialVersionUID Runtime serializace přiřadí číslo verze každé třídě Serializable nazývané SerialVersionUID, která se používá během deseralizace k ověření, že odesílatel a příjemce serializovaného objektu načetli třídy pro tento objekt, které jsou kompatibilní s ohledem na serializaci. Pokud příjemce načetl pro objekt třídu, která má jiné UID, než má odpovídající třída odesílatele, výsledkem deseralizace bude InvalidClassException .
Serializovatelná třída může deklarovat své vlastní UID explicitně deklarováním názvu pole. Musí být statický, konečný a typu dlouhý. tj. ANY-ACCESS-MODIFIER static final long serialVersionUID=42L; Pokud serializovatelná třída explicitně nedeklaruje serialVersionUID, pak serializační runtime vypočítá výchozí hodnotu pro tuto třídu na základě různých aspektů třídy, jak je popsáno ve specifikaci Java Object Serialization Specification. Důrazně se však doporučuje, aby všechny serializovatelné třídy explicitně deklarovaly hodnotu serialVersionUID, protože její výpočet je vysoce citlivý na detaily třídy, které se mohou lišit v závislosti na implementacích kompilátoru, jakákoli změna třídy nebo použití jiného id může ovlivnit serializovaná data. Doporučuje se také použít soukromý modifikátor pro UID, protože to není užitečné jako zděděný člen. serialver Serialver je nástroj, který je dodáván s JDK. Používá se k získání čísla serialVersionUID pro třídy Java.
Můžete spustit následující příkaz a získat serialVersionUID serialver [-classpath classpath] [-show] [classname…] Příklad 1:
Jáva
java převést int na řetězec
// Java code for serialization and deserialization> // of a Java object> import> java.io.*;> class> Demo> implements> java.io.Serializable> {> > public> int> a;> > public> String b;> > // Default constructor> > public> Demo(> int> a, String b)> > {> > this> .a = a;> > this> .b = b;> > }> }> class> Test> {> > public> static> void> main(String[] args)> > {> > Demo object => new> Demo(> 1> , 'geeksforgeeks');> > String filename = 'file.ser';> > > // Serialization> > try> > {> > //Saving of object in a file> > FileOutputStream file => new> FileOutputStream(filename);> > ObjectOutputStream out => new> ObjectOutputStream(file);> > > // Method for serialization of object> > out.writeObject(object);> > > out.close();> > file.close();> > > System.out.println('Object has been serialized');> > }> > > catch> (IOException ex)> > {> > System.out.println('IOException is caught');> > }> > Demo object1 => null> ;> > // Deserialization> > try> > {> > // Reading the object from a file> > FileInputStream file => new> FileInputStream(filename);> > ObjectInputStream in => new> ObjectInputStream(file);> > > // Method for deserialization of object> > object1 = (Demo)in.readObject();> > > in.close();> > file.close();> > > System.out.println('Object has been deserialized ');> > System.out.println('a = ' + object1.a);> > System.out.println('b = ' + object1.b);> > }> > > catch> (IOException ex)> > {> > System.out.println('IOException is caught');> > }> > > catch> (ClassNotFoundException ex)> > {> > System.out.println('ClassNotFoundException is caught');> > }> > }> }> |
>
char na celé číslo java
>
Výstup :
Object has been serialized Object has been deserialized a = 1 b = geeksforgeeks>
Příklad 2:
Jáva
// Java code for serialization and deserialization> // of a Java object> import> java.io.*;> class> Emp> implements> Serializable {> private> static> final> long> serialversionUID => > 129348938L;> > transient> int> a;> > static> int> b;> > String name;> > int> age;> > // Default constructor> public> Emp(String name,> int> age,> int> a,> int> b)> > {> > this> .name = name;> > this> .age = age;> > this> .a = a;> > this> .b = b;> > }> }> public> class> SerialExample {> public> static> void> printdata(Emp object1)> > {> > System.out.println('name = ' + object1.name);> > System.out.println('age = ' + object1.age);> > System.out.println('a = ' + object1.a);> > System.out.println('b = ' + object1.b);> > }> public> static> void> main(String[] args)> > {> > Emp object => new> Emp('ab',> 20> ,> 2> ,> 1000> );> > String filename = 'shubham.txt';> > // Serialization> > try> {> > // Saving of object in a file> > FileOutputStream file => new> FileOutputStream> > (filename);> > ObjectOutputStream out => new> ObjectOutputStream> > (file);> > // Method for serialization of object> > out.writeObject(object);> > out.close();> > file.close();> > System.out.println('Object has been serialized
'> > + 'Data before Deserialization.');> > printdata(object);> > // value of static variable changed> > object.b => 2000> ;> > }> > catch> (IOException ex) {> > System.out.println('IOException is caught');> > }> > object => null> ;> > // Deserialization> > try> {> > // Reading the object from a file> > FileInputStream file => new> FileInputStream> > (filename);> > ObjectInputStream in => new> ObjectInputStream> > (file);> > // Method for deserialization of object> > object = (Emp)in.readObject();> > in.close();> > file.close();> > System.out.println('Object has been deserialized
'> > + 'Data after Deserialization.');> > printdata(object);> > // System.out.println('z = ' + object1.z);> > }> > catch> (IOException ex) {> > System.out.println('IOException is caught');> > }> > catch> (ClassNotFoundException ex) {> > System.out.println('ClassNotFoundException' +> > ' is caught');> > }> > }> }> |
>
>
Výstup:
Object has been serialized Data before Deserialization. name = ab age = 20 a = 2 b = 1000 Object has been deserialized Data after Deserialization. name = ab age = 20 a = 0 b = 2000>
Popis pro výstup: Při deserializaci objektu jste viděli, že se hodnoty aab změnily. Důvod a byl označen jako přechodný a b byl statický.
V případě přechodné proměnné: - Proměnná definovaná pomocí přechodného klíčového slova není během procesu serializace serializována. Tato proměnná bude během deserializace inicializována s výchozí hodnotou. (např.: pro objekty je null, pro int je 0).
udělat while smyčku v Javě
V případě statické proměnné:- Proměnná definovaná pomocí statického klíčového slova není serializována během procesu serializace. Tato proměnná bude načtena s aktuální hodnotou definovanou ve třídě během deserializace.
Přechodné versus finále:
finále proměnné se budou podílet na serializaci přímo svými hodnotami.
Proto nemá smysl deklarovat konečnou proměnnou jako přechodnou.
//překladač přiřadí hodnotu konečné proměnné
příklad:
final int x= 10; int y = 20; System.out.println(x);// compiler will replace this as System.out.println(10)->10, protože x je konečné. System.out.println(y);//20>
Příklad 3:
Jáva
//java code for final with transient> import> java.io.*;> class> Dog> implements> Serializable{> > int> i=> 10> ;> > transient> final> int> j=> 20> ;> }> class> GFG {> > public> static> void> main (String[] args)> throws> IOException,ClassNotFoundException> > {> > Dog d1=> new> Dog();> > //Serialization started> > System.out.println(> 'serialization started'> );> > FileOutputStream fos=> new> FileOutputStream(> 'abc.ser'> );> > ObjectOutputStream oos=> new> ObjectOutputStream(fos);> > oos.writeObject(d1);> > System.out.println(> 'Serialization ended'> );> > > //Deserialization started> > System.out.println(> 'Deserialization started'> );> > FileInputStream fis=> new> FileInputStream(> 'abc.ser'> );> > ObjectInputStream ois=> new> ObjectInputStream(fis);> > Dog d2=(Dog) ois.readObject();> > System.out.println(> 'Deserialization ended'> );> > System.out.println(> 'Dog object data'> );> > //final result> > System.out.println(d2.i+> ' '> +d2.j);> > }> }> |
>
připojit k databázi java
>Výstup
serialization started Serialization ended Deserialization started Deserialization ended Dog object data 10 20>