Mis on Java serialiseerimise mõiste?



See artikkel aitab põhjalikul lähenemisel Java serialiseerimise kontseptsioonile koos reaalajas toodud näidetega paremaks mõistmiseks.

Serialiseerimine aastal on oluline mõiste, mis käsitleb objektide teisendamist baidivoogudeks, et transportida javaobjektid ühest Java virtuaalsest masinast teise ja taastada need algsel kujul. Panen selle artikli pesa ritta järgmiselt:

Mis on Java serialiseerimine?

Serialiseerimine Java on Java-koodi teisendamise protsess Objekt sisse a Baidivoog , objektikoodi teisaldamiseks ühest Java virtuaalsest masinast teise ja selle loomiseks protsessi abil Deserialiseerimine.





Serialization-in-Java-Edureka-Picture-1

Miks me vajame serialiseerimist Java keeles ?

Serialiseerimist vajame järgmistel põhjustel.



  • Suhtlus : Serialiseerimine hõlmab objekti protseduuri jadastamine ja edasikandumine. See võimaldab mitmel arvutisüsteemil objekte üheaegselt kujundada, jagada ja käivitada.

  • Vahemälu salvestamine : Objekti ehitamiseks kulutatud aeg on rohkem võrreldav ajaga, mis on vajalik objekti sarjast vabastamiseks. Serialiseerimine vähendab ajakulu vahemällu salvestamine hiiglaslikud esemed.

  • Sügav koopia : Kloonimine Serialiseerimine on protsess lihtsaks tehtud. Täpne koopia objekti saabjada objekti a baitide massiiv ja seejärel de-serialiseerimine.



  • Rist JVM-i sünkroonimine: Serialiseerimise peamine eelis on seetöötab erinevates JVM-ides, mis võivad töötada erinevatel arhitektuurid või Operatsioonisüsteemid

  • Püsivus: Mis tahes objekti olekut saab otse salvestada, rakendades sellele serialiseerimise ja salvestades a andmebaasi nii et saab hiljem kätte saadud.

    java leiab massiivi suurima arvu

Kuidas objekti serialiseerida?

TO Java objekt on jadatav ainult siis, kui tema klass või mõni tema vanemklass rakendab kas java . Mina . Serialiseeritav liides või selle aluspind, java.io.Välistatav.

Serialiseerimisprotsessis teisendame objekti oleku baidivooguks, et seda saaks ühelt JVM-ilt teisele üle kanda, ja tagastame baidivoo tagasi algseks objektiks.

// Liides

pakett Serial1 import java.io.Serializable public class Employee rakendab Serializable {private static final long serialVersionUID = 1L // Serial Version UID int id Stringi nimi public Employee (int id, String name) {this.id = id this.name = nimi }}

// Serialiseeri

pakett Serial1 import java.io. * klass Püsiv {public static void main (String args []) {proovige {Employee emp1 = uus töötaja (20110, 'John') töötaja emp2 = uus töötaja (22110, 'Jerry') töötaja emp3 = new Employee (20120, 'Sam') FileOutputStream fout = new FileOutputStream ('output.txt') ObjectOutputStream out = new ObjectOutputStream (fout) out.writeObject (emp1) out.writeObject (emp2) out.writeObject (emp3) out. flush () out.close () System.out.println ('Serialiseerimine ja deserialiseerimine on edukalt täidetud')} saak (erand e) {System.out.println (e)}}}

Väljund:

Serialiseerimine ja deserialiseerimine on edukalt täidetud

Deserialiseerimine : See on vastupidine serialiseerimise protsess, kus saatjalt objekti seerialiseeritud baitide voog taastatakse vastuvõtvas otsas.

// Deserialiseerimine

pakett Serial1 import java.io. * klass Depersist {public static void main (String args []) {proovige {ObjectInputStream sisse = uus ObjectInputStream (uus FileInputStream ('output.txt')) töötaja e1 = (töötaja) in.readObject ( ) Töötaja e2 = (töötaja) in.readObject () töötaja e3 = (töötaja) sisse.readObject () System.out.println (e1.id + '' + e1.nimi) System.out.println (e2.id + '' + e2.nimi) System.out.println (e3.id + '' + e3.nimi) in.close ()} saak (erand e) {System.out.println (e)}}}

Väljund:

20110 Johannes
22110 Jerry

20120 Sam

Java serialiseerimise eelised ja puudused

Eelised:

  • Serialiseerimisprotsess on a sisseehitatud funktsioon, mis ei vaja serialiseerimiseks kolmanda osapoole tarkvara
  • Serialiseerimisprotseduur on tõestatud lihtne ja lihtne aru saama

  • Serialiseerimise protseduur on universaalne ja erineva taustaga arendajad on talle tuttavad

  • Seda on lihtne kasutada ja lihtne kohandada

  • Serialiseeritud andmevood toetage krüptimist, tihendamist, autentimist ja turvaline Java-andmetöötlus

  • Seal on palju kriitilised tehnoloogiad tuginedes jadastamisele.

Puudused:

  • Objektid, kui DeSerialization muutub rabe ja pole kindel, et neid tõhusalt deSerialiseeritakse.

  • Serialiseerimise käigus deklareeritud transientsed muutujad loovad mäluruumi, kuid konstruktorit ei kutsuta, mille tagajärjel mööduvate muutujate initsialiseerimine ebaõnnestub Java Flow standardvariatsioon.

  • Jaotamisprotsess on ebaefektiivne mälu kasutamise osas.

  • Serialiseerimist ei ole soovitatav kasutada rakendustes, mis vajavad samaaegne juurdepääs nõudeta kolmanda osapoole API-d , kuna serialiseerimine ei paku üleminekukontrollimehhanismi iga SE kohta.

  • Serialiseerimismenetlust ei õnnestu pakkuda peeneteraline kontroll objektidele juurdepääsemiseks.

Java serialiseerimise praktilised näited

Serialiseerimine pärandi abil

Juhtum - 1: kui superklass on seriaalitav, on vaikimisi ka selle alamklassid jadatav.

Sel juhul on alaklass on vaikimisi jadatav, kui superklass rakendab Serialiseeritav liides

pakett SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable klass A rakendab Serializable {int i public A (int i) {this.i = i}} klass B laiendab A {int j public B (int i, int j) {super (i) this.j = j}} public class Test {public staatiline void main (String [] args) viskab erandi {B b1 = uus B (200 400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = uus FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objekt on järjestatud') FileInputStream fis = uus FileInputStream ('abc.ser') ObjectInputStream ois = uus ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('Objekt on deserialiseeritud') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Väljund:

j = 20
Objekt on järjestatud
Objekt on deserialiseeritud
i = 200
j = 400

Juhtum - 2: alamklassi saab järjestada, kui see rakendab jadatavat liidest, isegi kui superklass ei kasuta jadatavat liidest.

Sel juhul, kui superklass ei rakenda programmi Serialiseeritav liides , siis objektid alaklass saab käsitsi jadastada, rakendades alamklassis Serializable Interface.

kuidas kasutada java keeles trimmi
pakett SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable klassi superklass {int i public superclass (int i) {this.i = i} avalik superklass () {i = 50 System.out.println ('Superklassi konstruktorit nimetatakse')}} klassi alamklass laiendab superklasside töövahendeid Serialiseeritav {int j avalik alaklass (int i, int j) {super (i) this.j = j }} public class test2 {public static void main (String [] args) viskab erandi {alaklass b1 = uus alaklass (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = uus FileOutputStream ('output.ser') ObjectOutputStream oos = uus ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objekt on järjestatud') FileInputStream fis = new FileInputStream ('output.ser') ObjectInputStream ois = new ObjectInputStream (fis) alaklass b2 = (alamklass) ois.readObject ( ) ois.close () fis.close () System.out.println ('Objekt on deserialiseeritud') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Objekt on järjestatud
Helistas superklasside konstruktor
Objekt on deserialiseeritud
i = 50
j = 20

Juhtum - 3: kui superklass on jadatav, kuid me ei vaja alamklassi jadastamist.

Sellisel juhul saab alamklassi jadastamist vältidarakendades writeObject () ja readObject () meetodid alaklassis ja see peab viskama NotSerializableException nendest meetoditest.

paketi SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.IOException import java.io.NotSerializableException import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.ObjectOutputStream import java.io.io.Serial i avalik vanem (int i) {this.i = i}} klassi laps pikendab vanemat {int j avalik laps (int i, int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) viskab IOException {Dob new NotSerializableException ()} private void readObject (ObjectInputStream in) viskab IOException {viska uus NotSerializableException ()}} avaliku klassi test3 {public static void main (String [] args) viskab erandi {laps b1 = uus laps (100 200) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = uus FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('objekt on järjestatud ') FileInputStream fis = new FileInputStream (' abc.ser ') ObjectInputStream ois = new ObjectInputStream (fis) child b2 = (child) ois.readObject () ois.close () fis.close () System.out. println ('Objekt on deserialiseeritud') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Väljund:

i = 100
j = 200
Erand lõimes 'main' java.io.NotSerializableException
aadressil SerializationInheritance.child.writeObject (test3.java:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (kohalik meetod)

Serialiseerimine staatilise liikme abil

Staatilise liikme välja serialiseerimist ignoreeritakse jadamisprotsessis. Serialiseerimine onseotud objekti viimase olekuga. Seega on ainult klassi konkreetse eksemplariga seotud andmedjada, kuid mitte staatilise liikme väli.

package stati import java.io. * klass StaticSerial rakendab Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('Serialiseerimise ajal staatilisel liikmel on väärtus: '+ i) proovige {FileOutputStream fos = new FileOutputStream (' F: File.ser ') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (ob) oos.close () i = 99 FileInputStream fis = uus FileInputStream ('F: File.ser') ObjectInputStream ois = uus ObjectInputStream (fis) ob = (StaticSerial) ois.readObject () ois.close () System.out.println ('Pärast deserialiseerimist on staatilisel liikmel väärtus:' + i)} saak (erand e) {System.out.println (e)}}}

Väljund:

Serialiseerimise ajal on staatilise liikme väärtus: 100
Pärast deserialiseerimist on staatilise liikme väärtus: 99

Välistatav liides

The Välistatav liides Java on sarnane serialiseerimisega, kuid ainus erinevus on see, et see suudab pakkuda kohandatud jadastamine kus saate otsustada ojas haavatavate objektide üle.

Väljastatav liides on saadaval java.io-s ja see pakub kahte meetodit:

  • public void writeExternal (ObjectOutput out) viskab IOExceptioni
  • public void readExternal (ObjectInput in) viskab IOExceptioni

Peamised erinevused serialiseerimise ja väljastamise vahel on järgmised:

  • Rakendamine : Välistatav liides eristab kasutajat selgesõnaliselt mainida seerias olevaid objekte. Serialiseerimisliideses on kõik objektid ja muutujad järjestuses jooksuaeg.

  • Meetodid : Välistatav liides koosneb kahest meetodist, nimelt:

    • writeExternal ()

    • readExternal ()

Serialiseeritav liides ei sisalda ühtegi meetodit.

  • Protsess: Serialiseerimisprotsess välistatavas liideses pakub kohandamine jadamisprotsessi juurde. Kuid Serialiseerimise liides pakub vaikimisi jadamisprotsess.

  • Ühilduvus ja juhtimine tagurpidi: Väljastatav liides toetab serialiseerimist olenemata versiooni juhtimine ja ainus probleem on see, et superklassi jadastamisel peab vastutama kasutaja. Teisalt nõuab Serialization Interface sama versioon JVM-ide mõlemas otsas, kuid see hõlmab kõigi objektide ja klasside, sealhulgas superklasside, automaatset seeriat.

  • Avalik argumentideta konstruktor: Välistamise liidese vajadused Avalik vaidluseta konstruktor jadaobjekti rekonstrueerimiseks. Ehkki Serialization Interface ei vaja No-Arg Constructor'i, kasutab ta seda peegeldus jadaobjekti või klassi rekonstrueerimiseks.

package ext import java.io. * klassi demo rakendab java.io.Serializable {public int a public String b public Demo (int a, String b) {this.a = a this.b = b}} klassi test {public staatiline void main (String [] args) {Demo object = new Demo (1, 'Welcome to Edureka') String filename = 'file.ser' try {FileOutputStream file = new FileOutputStream (filename) ObjectOutputStream out = new ObjectOutputStream (file) out .writeObject (objekt) out.close () file.close () System.out.println ('Objekt on järjestatud')} saak (IOException ex) {System.out.println ('IOException on tabatud')} Demoobjekt1 = null proovige {FileInputStream fail = uus FileInputStream (failinimi) ObjectInputStream sisse = uus ObjectInputStream (fail) object1 = (Demo) in.readObject () sisse.close () file.close () System.out.println ('Objekt on olnud deserialiseeritud ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} saak (IOException ex) {System.out.println (' IOException on tabatud ')} saak (ClassNotFoundException ex) {System.out .println ('ClassNotFoundException on tabatud')}}}

Ajutine märksõna

Ajutine märksõna on a reserveeritud märksõna Java keeles. Seda kasutatakse a muutuja muuta serialiseerimisprotsessi ajal. Muutuja deklareerimine märksõnaga Transient väldib muutuja serialiseerimist.

Seeriaversiooni UID

Enne jadamisprotsessi algust seostatakse iga jadatav klass / objekt a-ga kordumatu identifitseerimisnumber pakub hostimasina JVM. Seda ainulaadset ID-d nimetatakse Seeriaversiooni UID . Seda UID-d kasutab JVM vastuvõtva otsa identifitseerimiseks, et kinnitada, et sama objekti DeSerialiseeritakse vastuvõtvas otsas.

Jadade serialiseerimise vastuolud

Oracle’i oma Arhitektid kavatsevad Java-lt serialiseerimise eemaldada, kuna peavad seda a Jube viga 1997. aastal . Pärast pingelist uurimist leidsid Oracle'i arendajad serialiseerimisprotseduuri kujundamisel mõned vead, mis ohustavad andmeid.

1997. aastalMark Reinhold kinnitab - Meile meeldib nimetada jadastamist „kingituseks, mida pidevalt jagatakse“, ja kingituse tüüp on turvaauke. Tõenäoliselt kolmandik kõigist Java haavatavustest on seotud serialiseerimisega, see võib olla üle poole. See on hämmastavalt viljakas haavatavuste allikas, rääkimata ebastabiilsustest. ”.

qtp ja seleeni vahe

On tõenäoline, et serialiseerimine eemaldatakse või asendatakse Java eelseisvates värskendustes ja teisest küljest Java-algajatele, Serialiseerimine ei saanud olla idealistlik variant oma projektides

Parimad tavad Java-s serialiseerimise kasutamisel

Järgnevalt on toodud mõned parimad tavad, mida tuleb järgida

  • Seda on soovitatav kasutada javadoc @ jadasilt serialiseeritavate väljade tähistamiseks.
  • The .olla laiendust eelistatakse kasutada jadastatud objekte esindavate failide jaoks.
  • Staatilisi ega mööduvaid välju ei soovitata läbida vaikeserialiseerimine.
  • Laiendatavad klassid ei tohiks Serialiseerida, kui see pole nii kohustuslik.
  • Siseklassid tuleks vältida osalemist serialiseerimises.

Sellega oleme jõudnud selle artikli lõppu. Loodan, et olete aru saanud Java serialiseerimise põhitõdedest, selle tüüpidest ja funktsioonidest.

Vaadake autor Edureka, usaldusväärne veebiõppeettevõte, mille võrgustik koosneb enam kui 250 000 rahulolevast õppijast ja mis levib üle kogu maailma. Edureka Java J2EE ja SOA koolitus- ja sertifitseerimiskursus on mõeldud õpilastele ja spetsialistidele, kes soovivad olla Java arendajad. Kursus on mõeldud selleks, et anda Java-programmeerimisele edukas algus ja õpetada teid nii Java-põhiprogrammide kui ka täiustatud kontseptsioonide ning erinevate Java-raamistike jaoks, nagu näiteks talveunerežiim ja Kevad .

Kas teil on meile küsimus? Mainige seda selle artikli “Java serialiseerimine” kommentaaride jaotises ja võtame teiega ühendust niipea kui võimalik.