Kāds ir Java serializācijas jēdziens?



Šis raksts palīdzēs ar visaptverošu pieeju Java serializācijas jēdzienam, kā arī reāllaika piemērus labākai izpratnei.

Serializācija ir svarīgs jēdziens, kas nodarbojas ar objektu pārveidošanu baitu straumē, lai java objektus pārvietotu no vienas Java virtuālās mašīnas uz otru un atjaunotu tos sākotnējā formā. Es ierindošu šī raksta kontaktligzdu šādi:

Kas ir Java serializācija?

Serializācija Java valodā ir Java koda pārveidošanas process Objekts uz a Baitu straume , lai pārsūtītu objekta kodu no vienas Java virtuālās mašīnas uz otru un atjaunotu to, izmantojot Deserializācija.





Serialization-in-Java-Edureka-Picture-1

Kāpēc mums ir nepieciešama serializācija Java valodā ?

Serializācija mums nepieciešama šādu iemeslu dēļ:



  • Komunikācija : Serializēšana ietver objekta procedūru serializācija un pārnešana. Tas ļauj vairākām datorsistēmām vienlaikus izstrādāt, koplietot un izpildīt objektus.

    kā instalēt hadoop Ubuntu
  • Kešatmiņa : Laiks, kas patērēts objekta uzbūvēšanai, ir vairāk salīdzināms ar laiku, kas vajadzīgs tā seriālizēšanai. Serializācija samazina laika patēriņu par kešatmiņa milzu objekti.

  • Dziļa kopija : Klonēšana process tiek vienkāršots, izmantojot Serializāciju. Precīzs kopija objektu iegūstserializējot objektu uz a baitu masīvs un pēc tam noņemiet to no sērijas.



  • Krusts JVM sinhronizācija: Serializācijas galvenā priekšrocība ir tādarbojas dažādos JVM, kas, iespējams, darbojas dažādos arhitektūras vai Operētājsistēmas

  • Noturība: Jebkura objekta stāvokli var tieši saglabāt, tam piemērojot Serialization un saglabājot a datu bāzē lai tā varētu būt izgūts vēlāk.

Kā mēs serializējam objektu?

TO Java objekts ir seriālizējams tikai tad, ja tās klase vai kāda no vecāku klasēm īsteno vai nu java . Es . Serializējams saskarne vai tās apakš saskarne, java.io.Externalizable.

Serializācijas procesā objekta stāvokli pārvēršam baitu straumē, lai to varētu pārsūtīt no viena JVM uz otru, un baitu straumi atgriezīsim sākotnējā objektā.

// Saskarne

pakotne Serial1 importējiet java.io.Serializējamā publiskā klase Darbinieks ievieš Serializējamo {private static final long serialVersionUID = 1L // Sērijas versija UID int id String name public Employee (int id, String name) {this.id = id this.name = name }}

// Serializēt

pakete Serial1 importēt java.io. * klase Persist {public static void main (String args []) {try {Employee emp1 = new Employee (20110, 'John') Employee emp2 = new Employee (22110, 'Jerry') Employee 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 ('Serializācija un deserializācija ir veiksmīgi izpildīta')} catch (izņēmums e) {System.out.println (e)}}}

Izeja:

Serializācija un deserializācija ir veiksmīgi izpildīta

Deserializācija : Tas ir reversais serializācijas process, kurā saņēmēja galā tiek atjaunota sūtītāja objekta sērijveida baitu straume.

// Deserialise

pakete Serial1 importējiet java.io. * klase Depersist {public static void main (String args []) {mēģiniet {ObjectInputStream in = jauns ObjectInputStream (jauns FileInputStream ('output.txt')) darbinieks e1 = (darbinieks) in.readObject ( ) Darbinieks e2 = (Darbinieks) in.readObject () Darbinieks e3 = (Darbinieks) in.readObject () System.out.println (e1.id + '' + e1.name) System.out.println (e2.id + '' + e2.name) System.out.println (e3.id + '' + e3.name) in.close ()} catch (izņēmums e) {System.out.println (e)}}}

Izeja:

20110 Jānis
22110 Džerijs

20120 Sam

Java serializācijas priekšrocības un trūkumi

Priekšrocības:

  • Serializācijas process ir a iebūvēts funkcija, kurai nav nepieciešama trešās puses programmatūra, lai veiktu serializāciju
  • Serializācijas procedūra ir pierādīta vienkārši un viegli saprast

  • Serializācijas procedūra ir universāls un izstrādātāji no atšķirīgas izcelsmes tai ir pazīstami

  • To ir viegli lietot un vienkārši pielāgojams

  • Serializētās datu plūsmas atbalsta šifrēšanu, saspiešanu, autentifikāciju un droša Java skaitļošana

  • Tur ir daudz kritiskās tehnoloģijas paļaujoties uz serializāciju.

Trūkumi:

atrodiet masīvā lielāko skaitu
  • Objekti, kamēr DeSerialization kļūst trausls un viņi nav pārliecināti, ka viņi tiks efektīvi deSerialized.

  • Deklarētie pārejošie mainīgie, kamēr serializācija rada atmiņas vietu, bet konstruktors netiek izsaukts, kā rezultātā pārejošo mainīgo inicializēšana neizdodas, kā rezultātā standarta Java plūsmas variācija.

  • Serializācijas process ir neefektīvs atmiņas izmantošanas ziņā.

  • Serializāciju nav vēlams izmantot vajadzīgajās lietojumprogrammās vienlaicīga piekļuve bez prasības trešo pušu API , jo serializācija nepiedāvā nekādu pārejas kontroles mehānismu katrai SE.

  • Serializācijas procedūra netiek piedāvāta smalkgraudaina kontrole lai piekļūtu objektiem.

Praktiski Java serializācijas piemēri

Serializācija, izmantojot mantojumu

1. gadījums: ja Superclass ir seriālizējams, pēc noklusējuma seriālizējamas ir arī tā apakšklases.

Šajā gadījumā apakšklase pēc noklusējuma ir seriālizējams, ja superklase īsteno Serializējama saskarne

pakete SerializationInheritance importēt java.io.FileInputStream importēt java.io.FileOutputStream importēt java.io.ObjectInputStream importēt java.io.ObjectOutputStream importēt java.io.Serializable A klase ievieš Serializable {int i public A (int i) {this.i = i}} B klase pagarina A {int j public B (int i, int j) {super (i) this.j = j}} public class Test {public static void main (String [] args) throws Exception {B b1 = new B (200,400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objekts ir seriālizēts') FileInputStream fis = jauns FileInputStream ('abc.ser') ObjectInputStream ois = new ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('Objekts ir deserializēts') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Izeja:

j = 20
Objekts ir sērijveidā
Objekts ir deserializēts
i = 200
j = 400

2. gadījums: Apakšklasi var sērijveidot, ja tā ievieš Serializējamo saskarni, pat ja Superklase neievieš Serializējamo saskarni.

Šajā gadījumā, ja superklase neīsteno programmu Serializējama saskarne , tad objektus apakšklase var manuāli seriālizēt, apakšklasē ieviešot Serializējamo saskarni.

pakete SerializationInheritance importēt java.io.FileInputStream importēt java.io.FileOutputStream importēt java.io.ObjectInputStream importēt java.io.ObjectOutputStream importēt java.io.Serializable klases superklasi {int i public superclass (int i) {this.i = i} public superclass () {i = 50 System.out.println ('Superclass konstruktoru sauc')}} klases apakšklase paplašina superklases rīkus Serializējamo {int j publisko apakšklasi (int i, int j) {super (i) this.j = j }} public class test2 {public static void main (String [] args) izmet izņēmumu {apakšklase b1 = jauna apakšklase (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = new FileOutputStream ('output.ser') ObjectOutputStream oos = jauns ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objekts ir sērijveidots') FileInputStream fis = new FileInputStream ('output.ser') ObjectInputStream ois = new ObjectInputStream (fis) apakšklase b2 = (apakšklase) ois.readObject ( ) ois.close () fis.close () System.out.println ('Objekts ir deserializēts') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Objekts ir sērijveidā
Zvanīja superklases konstruktors
Objekts ir deserializēts
i = 50
j = 20

3. gadījums: ja superklase ir seriālizējama, bet mums nav nepieciešama apakšklases serializācija.

Šajā gadījumā var novērst apakšklases serializācijuieviešot writeObject () un readObject () metodes apakšklasē, un tas ir jāmet NotSerializableException no šīm metodēm.

pakotne SerializationInheritance importēt java.io.FileInputStream importēt java.io.FileOutputStream importēt java.io.IOException importēt java.io.NotSerializableException importēt java.io.ObjectInputStream importēt java.io.ObjectOutputStream importēt java.io.ObjectOutputStream importēt java.io.io.io.Serial i public Parent (int i) {this.i = i}} klases bērns pagarina vecāku {int j publiskais bērns (int i, int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) izmet IOException {thrown new NotSerializableException ()} private void readObject (ObjectInputStream in) throws IOException {thrown new NotSerializableException ()}} public class test3 {public static void main (String [] args) throws Exception {child b1 = new child (100, 200) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('objekts ir seriālizēts ') FileInputStream fis = new FileInputStream (' abc.ser ') ObjectInputStream ois = new ObjectInputStream (fis) child b2 = (child) ois.readObject () ois.close () fis.close () System.out. println ('Objekts ir deserializēts') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Izeja:

i = 100
j = 200
Izņēmums pavedienā 'main' java.io.NotSerializableException
vietnē SerializationInheritance.child.writeObject (test3.java:48)
pie sun.reflect.NativeMethodAccessorImpl.invoke0 (vietējā metode)

Serializācija, izmantojot statisko locekli

Serializācijas procesā statiskā dalībnieka lauka serializācija tiek ignorēta. Serializācija irkas saistīti ar objekta jaunāko stāvokli. Tādējādi ir tikai dati, kas saistīti ar konkrētu klases gadījumusērijveida, bet ne statiskā dalībnieka lauks.

pakete stati import java.io. * klase StaticSerial īsteno Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('Serializācijas laikā, statiskajam dalībniekam ir vērtība: '+ i) mēģiniet {FileOutputStream fos = new FileOutputStream (' F: File.ser ') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (ob) oos.close () i = 99 FileInputStream fis = jauns FileInputStream ('F: File.ser') ObjectInputStream ois = jauns ObjectInputStream (fis) ob = (StaticSerial) ois.readObject () ois.close () System.out.println ('Pēc deserializācijas statiskajam dalībniekam ir vērtība:' + i)} catch (e izņēmums) {System.out.println (e)}}}

Izeja:

Serializācijas laikā statiskā locekļa vērtība ir 100
Pēc deserializācijas statiskajam loceklim ir vērtība: 99

Ārēji izmantojama saskarne

The Ārēji izmantojama saskarne Java ir līdzīgs Serialization, bet vienīgā atšķirība ir tā, ka tā spēj piedāvāt pielāgota serializācija kur jums jāizlemj par straumē šķīstošajiem objektiem.

Externalizable saskarne ir pieejama vietnē java.io, un tā nodrošina divas metodes:

  • public void writeExternal (ObjectOutput out) izmet IOException
  • public void readExternal (ObjectInput in) iemet IOException

Galvenās atšķirības starp serializāciju un ārpuses mainīšanu ir šādas:

  • Īstenošana : Ārējā ārējā saskarne izaicina lietotāju nepārprotami pieminēt sērijveida objektus. Serializācijas saskarnē visi objekti un mainīgie ir seriālizēti izpildes laiks.

  • Metodes : Ārēji izmantojamais interfeiss sastāv no divām metodēm, proti:

    • writeExternal ()

    • readExternal ()

Serializējamā saskarne neietver metodes.

  • Process: Serializācijas process ārējā saskarnē nodrošina pielāgošana serializācijas procesam. Bet Serializācijas interfeiss nodrošinās noklusējums serializācijas process.

  • Saderība un vadība atpakaļ: Ārēji pārveidojamā saskarne atbalsta serializāciju neatkarīgi no versijas vadība un vienīgā problēma ir tā, ka lietotājam ir jābūt atbildīgam, sērijveidojot Super Class. No otras puses, Serializācijas saskarnei ir nepieciešama tā pati versija abos galos, bet tas ietver visu objektu un klašu, ieskaitot superklases, automātisku sērijveidošanu.

    mana sql apmācība iesācējiem

  • Publisks bez argumentu konstruktors: Ārējās saskarnes vajadzības Publisks bezargu konstruktors sērijveida objekta rekonstrukcijai. Lai gan serializācijas saskarnei nav nepieciešams No-Arg konstruktors, tā vietā tā tiek izmantota pārdomas lai rekonstruētu sērijveida objektu vai klasi.

pakete ext import java.io. * klases demonstrācija ievieš java.io.Serializable {public int a public String b public Demo (int a, String b) {this.a = a this.b = b}} klases tests {public static 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 (object) out.close () file.close () System.out.println ('Objekts ir sērijveidots')} catch (IOException ex) {System.out.println ('IOException ir noķerts')} Demonstrācijas objekts1 = null mēģiniet {FileInputStream fails = jauns FileInputStream (faila nosaukums) ObjectInputStream in = jauns ObjectInputStream (fails) object1 = (Demo) in.readObject () in.close () file.close () System.out.println ('Objekts ir bijis deserialized ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} catch (IOException ex) {System.out.println (' IOException ir nozvejots ')} catch (ClassNotFoundException ex) {System.out .println ('ClassNotFoundException ir noķerts')}}}

Pārejošs atslēgvārds

Pārejošais atslēgvārds ir a rezervēts atslēgvārds Java valodā. To lieto kā mainīgs modificēt Serializācijas procesa laikā. Deklarējot mainīgo ar pārejošu atslēgvārdu, mainīgais netiek serializēts.

Seriālās versijas UID

Pirms serializācijas procesa sākuma katra seriālizējamā klase / objekts tiek saistīts ar unikāls identifikācijas numurs nodrošina resursdatora JVM. Tiek izsaukts šis unikālais ID Seriālās versijas UID . Šis UID tiek izmantots kā saņēmēja gala JVM identifikācija, lai apstiprinātu, ka tas pats objekts tiek DeSerialized saņemošajā galā.

Serializācijas pretrunas Java

Oracle Arhitekti plāno noņemt Java serializāciju, jo uzskata to par Briesmīga 1997. gada kļūda . Pēc drudžainiem pētījumiem Oracle izstrādātāji noskaidroja dažus Serializācijas procedūras izstrādes trūkumus, kas apdraud datus.

1997. gadāMarks Reinholds norāda - Mēs vēlamies seriālizāciju saukt par “dāvanu, kas turpina dot”, un dāvanas veids, ko tā turpina dot, ir drošības ievainojamība. Iespējams, ka trešdaļa visu Java ievainojamību ir saistīta ar serializāciju, tā varētu būt vairāk nekā puse. Tas ir pārsteidzoši augsts ievainojamības avots, nemaz nerunājot par nestabilitāti. ”.

Pastāv izredzes, ka gaidāmajos Java atjauninājumos serializācija tiks noņemta vai aizstāta, un, no otras puses, iesācējiem Java, serializācija nevarētu būt ideālistisks variants savos projektos

Labākā prakse, izmantojot Java serializāciju

Tālāk ir sniegtas dažas labākās prakses, kas jāievēro

  • Ieteicams lietot javadoc @ sērijas tags serializējamo lauku apzīmēšanai.
  • The .būt paplašinājumu ieteicams izmantot failiem, kas attēlo sērijveida objektus.
  • Nav ieteicams iziet nevienu statisku vai pārejošu lauku noklusējuma serializācija.
  • Paplašināmās klases nevajadzētu serializēt, ja vien tā nav obligāts.
  • Iekšējās klases jāizvairās iesaistīties serializācijā.

Ar to mēs esam nonākuši šī raksta beigās. Es ceru, ka esat sapratis Java serializācijas pamatus, tā veidus un funkcijas.

Pārbaudiet Autors: Edureka, uzticams tiešsaistes mācību uzņēmums ar vairāk nekā 250 000 apmierinātu izglītojamo tīklu visā pasaulē. Edureka Java J2EE un SOA apmācības un sertifikācijas kurss ir paredzēts studentiem un profesionāļiem, kuri vēlas būt Java izstrādātāji. Kurss ir paredzēts, lai dotu jums iespēju sākt Java programmēšanu un apmācīt gan pamata, gan uzlabotas Java koncepcijas, kā arī dažādas Java struktūras, piemēram, hibernēt un Pavasaris .

Vai mums ir jautājums? Pieminiet to šī raksta “Serializācija Java” komentāru sadaļā, un mēs pēc iespējas ātrāk sazināsimies ar jums.