Serializacija je mehanizem za pretvorbo stanja objekta v tok bajtov. Deserializacija je obratni postopek, kjer se tok bajtov uporablja za ponovno ustvarjanje dejanskega predmeta Java v pomnilniku. Ta mehanizem se uporablja za ohranitev predmeta.
Ustvarjeni tok bajtov je neodvisen od platforme. Torej je objekt, serializiran na eni platformi, mogoče deserializirati na drugi platformi. Da omogočimo serializiranje objekta Java, implementiramo java.io.Serializable vmesnik. Razred ObjectOutputStream vsebuje writeObject() metoda za serializacijo objekta.
public final void writeObject(Object obj) throws IOException>
Razred ObjectInputStream vsebuje readObject() metoda za deserializacijo objekta.
public final Object readObject() throws IOException, ClassNotFoundException>
Prednosti serializacije
- Za shranjevanje/vzdrževanje stanja predmeta.
- Za potovanje predmeta po omrežju.

Serializirati je mogoče le objekte tistih razredov, ki izvajajo java.io.Serializable vmesnik. Serializable je a vmesnik markerjev (nima podatkovnega člana in metode). Uporablja se za označevanje razredov Java, tako da lahko predmeti teh razredov dobijo določene zmogljivosti. Drugi primeri vmesnikov za označevanje so: - Cloneable in Remote.
rimske številke 1-100
Točke, ki si jih je treba zapomniti
1. Če ima nadrejeni razred implementiran vmesnik Serializable, ga podrejenemu razredu ni treba implementirati, vendar obratno ne velja.
2. S postopkom serializacije se shranijo le nestatični podatkovni člani.
3. Statični in prehodni podatkovni člani se ne shranijo s postopkom serializacije. Torej, če ne želite shraniti vrednosti nestatičnega podatkovnega člana, ga naredite prehodnega.
4. Ko je objekt deserializiran, se konstruktor objekta nikoli ne pokliče.
5. Povezani objekti morajo izvajati vmesnik Serializable. Primer:
class A implements Serializable{ // B also implements Serializable // interface. B ob=new B(); }> SerialVersionUID Izvajalno okolje serializacije poveže številko različice z vsakim razredom Serializable, imenovanim SerialVersionUID, ki se uporablja med deserializacijo za preverjanje, ali sta pošiljatelj in prejemnik serializiranega objekta naložila razrede za ta objekt, ki so združljivi glede na serializacijo. Če je prejemnik naložil razred za predmet, ki ima drugačen UID od ustreznega razreda pošiljatelja, bo deserializacija povzročila InvalidClassException .
Razred Serializable lahko eksplicitno deklarira svoj UID z deklaracijo imena polja. Biti mora statičen, končen in dolg. tj. ANY-ACCESS-MODIFIER static final long serialVersionUID=42L; Če razred, ki ga je mogoče serializirati, ne deklarira izrecno serialVersionUID, bo izvajalno okolje serializacije izračunalo privzetega za ta razred na podlagi različnih vidikov razreda, kot je opisano v specifikaciji serializacije objekta Java. Vendar je močno priporočljivo, da vsi razredi, ki jih je mogoče serializirati, eksplicitno deklarirajo vrednost serialVersionUID, ker je njen izračun zelo občutljiv na podrobnosti razreda, ki se lahko razlikujejo glede na implementacije prevajalnika, vsaka sprememba razreda ali uporaba drugačnega ID-ja lahko vpliva na serializirane podatke. Priporočamo tudi uporabo zasebnega modifikatorja za UID, ker ni uporaben kot podedovan član. serialver Serialver je orodje, ki je priloženo JDK. Uporablja se za pridobitev številke serialVersionUID za razrede Java.
Zaženete lahko naslednji ukaz, da dobite serialVersionUID serialver [-classpath classpath] [-show] [classname…]
Primer 1:
Java
// 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');> >}> >}> }> |
r in c programiranje
>
>
Izhod:
Object has been serialized Object has been deserialized a = 1 b = geeksforgeeks>
Primer 2:
Java
razred matematike java
// 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');> >}> >}> }> |
>
>
Izhod:
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>
Opis za izhod: Med deserializacijo predmeta ste videli, da sta se vrednosti a in b spremenili. Razlog a je bil označen kot prehoden, b pa statičen.
V primeru prehodne spremenljivke:- Spremenljivka, definirana s prehodno ključno besedo, med postopkom serializacije ni serializirana. Ta spremenljivka bo med deserializacijo inicializirana s privzeto vrednostjo. (npr.: za objekte je nič, za int je 0).
V primeru statične spremenljivke:- Spremenljivka, definirana s ključno besedo static, med postopkom serializacije ni serializirana. Ta spremenljivka bo med deserializacijo naložena s trenutno vrednostjo, definirano v razredu.
Prehodno proti končnemu:
dokončno spremenljivke bodo vključene v serializacijo neposredno s svojimi vrednostmi.
Zato razglasitev končne spremenljivke kot prehodne ni uporabna.
//prevajalnik dodeli vrednost končni spremenljivki
primer:
začne se z javo
final int x= 10; int y = 20; System.out.println(x);// compiler will replace this as System.out.println(10)->10, ker je x končni. System.out.println(y);//20>
Primer 3:
Java
//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);> >}> }> |
enakost nizov v Javi
>
>Izhod
serialization started Serialization ended Deserialization started Deserialization ended Dog object data 10 20>