Hvad er begrebet serialisering i Java?



Denne artikel hjælper med en omfattende tilgang til begrebet Serialisering i Java sammen med eksempler i realtid for bedre forståelse.

Serialisering i er et vigtigt koncept, der beskæftiger sig med konvertering af objekter til en byte-strøm for at transportere java-objekterne fra den ene Java Virtual Machine til den anden og genskabe dem til den oprindelige form. Jeg vil oprette docket til denne artikel som nedenfor:

hvordan man vender en strengpython

Hvad er serialisering i Java?

Serialisering i Java er processen med at konvertere Java-koden Objekt ind i en Byte Stream , for at overføre objektkoden fra en Java Virtual-maskine til en anden og genskabe den ved hjælp af Deserialisering.





Serialization-in-Java-Edureka-Picture-1

Hvorfor har vi brug for serialisering i Java ?

Vi har brug for serialisering af følgende grunde:



  • Meddelelse : Serialisering involverer proceduren for objekt serialisering og smitte. Dette gør det muligt for flere computersystemer at designe, dele og udføre objekter samtidigt.

  • Caching : Den tid, der bruges til at opbygge et objekt, er mere sammenlignet med den tid, det tager at afserialisere det. Serialisering minimerer tidsforbruget med caching de gigantiske objekter.

  • Dyb kopi : Kloning processen gøres enkel ved hjælp af Serialization. En nøjagtig replika af et objekt opnås vedseriel genstand til en byte-array og derefter de-serialisere det.



  • Kryds JVM-synkronisering: Den største fordel ved serialisering er, at denfungerer på tværs af forskellige JVM'er, der muligvis kører på forskellige arkitekturer eller Operativsystemer

  • Udholdenhed: Tilstanden for ethvert objekt kan gemmes direkte ved at anvende Serialization på det og gemmes i en database så det kan være hentet senere.

Hvordan serialiserer vi et objekt?

TIL Java-objekt er kan serialiseres hvis og kun hvis dens klasse eller nogen af ​​dens overordnede klasser implementerer enten java . jeg . Serialiserbar interface eller dets undergrænseflade, java.io. kan udvides.

I serialiseringsprocessen konverterer vi et objekts tilstand til en byte-strøm, så det kunne overføres fra den ene JVM til den anden og vende byte-strømmen tilbage til det originale objekt.

// Interface

pakke Serial1 import java.io.Serialiserbar offentlig klasse Medarbejder implementerer Serialiserbar {privat statisk endelig lang serialVersionUID = 1L // Seriel version UID int id String navn offentlig medarbejder (int id, String navn) {this.id = id this.name = navn }}

// Serialiser

pakke Serial1 import java.io. * klasse Persist {public static void main (String args []) {try {Medarbejder emp1 = ny medarbejder (20110, 'John') Medarbejder emp2 = ny medarbejder (22110, 'Jerry') Medarbejder emp3 = ny medarbejder (20120, 'Sam') FileOutputStream fout = ny FileOutputStream ('output.txt') ObjectOutputStream out = new ObjectOutputStream (fout) out.writeObject (emp1) out.writeObject (emp2) out.writeObject (emp3) out. flush () out.close () System.out.println ('Serialisering og deserialisering er udført med succes')} fangst (Undtagelse e) {System.out.println (e)}}}

Produktion:

Serialisering og deserialisering er udført med succes

Deserialisering : Det er den omvendte proces med serialisering, hvor den serielle byte-strøm af et objekt fra afsenderen genskabes i den modtagende ende.

// Deserialisering

pakke Serial1 import java.io. * klasse Depersist {public static void main (String args []) {try {ObjectInputStream in = new ObjectInputStream (new FileInputStream ('output.txt')) Medarbejder e1 = (Medarbejder) in.readObject ( ) Medarbejder e2 = (Medarbejder) in.readObject () Medarbejder e3 = (Medarbejder) 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 (Undtagelse e) {System.out.println (e)}}}

Produktion:

20110 John
22110 Jerry

20120 Sam

Fordele og ulemper ved serialisering i Java

Fordele:

  • Serialiseringsprocessen er en indbygget funktion, der ikke kræver tredjepartssoftware for at udføre serialisering
  • Serialiseringsproceduren er bevist enkel og let at forstå

  • Serialiseringsproceduren er universel og udviklere med forskellig baggrund kender det

  • Det er let at bruge og let at tilpasse

  • Serialiserede datastrømme understøtter kryptering, komprimering, godkendelse og sikker Java-computing

  • Der er mange kritiske teknologier stole på serialisering.

Ulemper:

  • Objekter, mens DeSerialization bliver skør og de er ikke sikre på, at deSerialiseres effektivt.

  • De forbigående variabler, der er erklæret, mens serialisering skaber hukommelsesplads, men konstruktøren kaldes ikke, hvilket resulterer i svigt i initialiseringen af ​​forbigående variabler, hvilket resulterer i en variation til Standard Java Flow.

  • Processen med serialisering er ineffektiv med hensyn til hukommelsesudnyttelse.

  • Serialisering foretrækkes ikke at blive brugt i de applikationer, der har brug for samtidig adgang uden krav om tredjeparts API'er , da Serialization ikke tilbyder nogen overgangskontrolmekanisme pr. hvert SE.

  • Serialiseringsproceduren kan ikke tilbydes finkornet kontrol for at få adgang til objekter.

Praktiske eksempler på serialisering i Java

Serialisering ved hjælp af arv

Tilfælde - 1: Hvis superklassen kan serialiseres, kan dens underklasser som standard også serieriseres.

I dette tilfælde er underklasse kan serieres som standard, hvis superklasse implementerer Serialiserbart interface

pakke SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serialiserbar klasse A implementerer Serialiserbar {int i public A (int i) {this.i = i}} klasse B udvider A {int j offentlig B (int i, int j) {super (i) this.j = j}} offentlig klasse Test {offentlig statisk ugyldig hoved (String [] args) kaster Undtagelse {B b1 = ny B (200.400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = ny FileOutputStream ('abc.ser') ObjectOutputStream oos = ny ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objektet er blevet serialiseret') FileInputStream fis = ny FileInputStream ('abc.ser') ObjectInputStream ois = ny ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('Objektet er deserialiseret') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Produktion:

j = 20
Objektet er blevet serieliseret
Objektet er deserialiseret
jeg = 200
j = 400

Tilfælde 2: En underklasse kan serieiseres, hvis den implementerer Serializable Interface, selvom en Superclass ikke implementerer Serializable Interface.

I dette tilfælde, hvis superklasse implementerer ikke Serialiserbart interface derefter objekterne af underklasse kan serieindstilles manuelt ved at implementere Serializable Interface i underklassen.

pakke SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serialiserbar klasse superklasse {int i offentlig superklasse (int i) {this.i = i} offentlig superklasse () {i = 50 System.out.println ('Superklaskonstruktør kaldet')}} klasse underklasse udvider superklasse implementerer Serialiserbar {int j offentlig underklasse (int i, int j) {super (i) this.j = j }} public class test2 {public static void main (String [] args) throw Exception {subclass b1 = new subclass (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = ny FileOutputStream ('output.ser') ObjectOutputStream oos = ny ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objektet er blevet serialiseret') FileInputStream fis = ny FileInputStream ('output.ser') ObjectInputStream ois = ny ObjectInputStream (fis) underklasse b2 = (underklasse) ois.readObject ( ) ois.close () fis.close () System.out.println ('Objektet er deserialiseret') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Objektet er blevet serieliseret
Superklasse konstruktør kaldes
Objektet er deserialiseret
jeg = 50
j = 20

Tilfælde - 3: Hvis superklassen kan serienummeres, men vi har ikke brug for, at underklassen serieliseres.

db browser til sqlite tutorial

I dette tilfælde kan serialisering af underklassen forhindresved at implementere writeObject () og readObject () metoder i underklassen, og den skal kaste NotSerializableException fra disse metoder.

pakke 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.Serialiserbar klasse Parentimplement i offentlig forælder (int i) {this.i = i}} klassebarn udvider Forælder {int j offentligt barn (int i, int j) {super (i) this.j = j} privat ugyldigt writeObject (ObjectOutputStream ud) kaster IOException {throw new NotSerializableException ()} private void readObject (ObjectInputStream in) throw IOException {throw new NotSerializableException ()}} public class test3 {public static void main (String [] args) throw Exception {child b1 = new child (100, 200) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = ny FileOutputStream ('abc.ser') ObjectOutputStream oos = ny ObjectOutputStream ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objekt er blevet serieliseret ') FileInputStream fis = ny FileInputStream (' abc.ser ') ObjectInputStream ois = ny ObjectInputStream (fis) barn b2 = (barn) ois.readObject () ois.close () fis.close () System.out. println ('Objekt er deserialiseret') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Produktion:

jeg = 100
j = 200
Undtagelse i tråden 'main' java.io.NotSerializableException
ved SerializationInheritance.child.writeObject (test3.java:48)
ved sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)

Serialisering ved hjælp af et statisk medlem

Serialisering af det statiske medlemsfelt ignoreres i serieiseringsprocessen. Serialisering errelateret til objektets seneste tilstand. Derfor er kun de data, der er knyttet til en bestemt forekomst af en klasseseriel, men ikke feltet Statisk medlem.

pakke stati import java.io. * klasse StaticSerial implementerer Serialiserbar {statisk int i = 100 offentlig statisk ugyldig main (String ... ar) {StaticSerial ob = ny StaticSerial () System.out.println ('På tidspunktet for serialisering, statisk medlem har værdi: '+ i) prøv {FileOutputStream fos = ny FileOutputStream (' F: File.ser ') ObjectOutputStream oos = ny ObjectOutputStream (fos) oos.writeObject (ob) oos.close () i = 99 FileInputStream fis = ny FileInputStream ('F: File.ser') ObjectInputStream ois = ny ObjectInputStream (fis) ob = (StaticSerial) ois.readObject () ois.close () System.out.println ('Efter deserialisering har det statiske medlem værdi:' + i)} fange (Undtagelse e) {System.out.println (e)}}}

Produktion:

På tidspunktet for serialisering har statisk medlem værdi: 100
Efter deserialisering har det statiske medlem værdi: 99

Eksternt interface

Det Eksternt interface i Java ligner Serialization, men den eneste forskel er, at den er i stand til at tilbyde tilpasset serialisering hvor du kommer til at bestemme de objekter, der skal sores i strømmen.

Den eksterniserbare grænseflade er tilgængelig i java.io, og den giver to metoder:

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

De vigtigste forskelle mellem serialisering og eksternalisering er som følger:

  • Implementering : Eksterniserbart interface undtager brugeren det eksplicit nævne de objekter, der skal serienummeres. I Serialization Interface serieres alle objekter og variabler i kørselstid.

  • Metoder : Eksterniserbart interface består af to metoder, nemlig:

    • writeExternal ()

    • readExternal ()

Serialiserbart interface inkluderer ikke nogen metoder.

  • Behandle: Serialiseringsprocessen i eksterniserbart interface giver tilpasning til serialiseringsprocessen. Men Serialization Interface giver Standard serieiseringsproces.

    sorter algoritmer c ++

  • Bagudkompatibilitet og kontrol: Eksterniserbart interface understøtter serialisering uanset versionskontrol og det eneste problem er, at brugeren skal være ansvarlig, mens Super Class serialiseres. På den anden side kræver Serialization Interface samme version af JVM'er i begge ender, men den inkorporerer automatisk serialisering af alle objekter og klasser inklusive superklassen.

  • Offentlig No-Arg konstruktør: Behov for eksterniseringsgrænseflade Offentlig No-Arg Constructor at rekonstruere det serielle objekt. Mens Serialization Interface ikke kræver No-Arg Constructor, bruger den i stedet afspejling at rekonstruere det serielle objekt eller klasse.

pakkeekst import java.io. * klasse Demo implementerer java.io.Serialiserbar {public int a public String b 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, 'Welcome to Edureka') String filnavn = 'file.ser' prøv {FileOutputStream fil = ny FileOutputStream (filnavn) ObjectOutputStream ud = ny ObjectOutputStream (fil) ud .writeObject (object) out.close () file.close () System.out.println ('Object is been serialised')} catch (IOException ex) {System.out.println ('IOException is caught')} Demo object1 = null prøv {FileInputStream-fil = ny FileInputStream (filnavn) ObjectInputStream i = ny ObjectInputStream (fil) object1 = (Demo) i.readObject () in.close () file.close () System.out.println ('Object has been deserialiseret ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} fangst (IOException ex) {System.out.println (' IOException er fanget ')} fangst (ClassNotFoundException ex) {System.out .println ('ClassNotFoundException er fanget')}}}

Forbigående nøgleord

Transient Keyword er en reserveret nøgleord i Java. Det bruges som en variabel ændre på tidspunktet for serialiseringsprocessen. Når man erklærer en variabel med Transient-nøgleord, undgår man, at variablen bliver Serialized.

Seriel version UID

Inden serialiseringsprocessen begynder, bliver hver serie, der kan serialiseres, forbundet med en unikt identifikationsnummer leveret af JVM fra værtsmaskinen. Dette unikke ID kaldes Seriel version UID . Denne UID bruges som en identifikation af den modtagende ende af JVM for at bekræfte, at det samme objekt bliver DeSerialized i den modtagende ende.

Kontroverser om serialisering i Java

Oracle's Arkitekter har til hensigt at fjerne Serialization fra Java, da de betragter det som en Horrible Mistake of 1997 . Efter hektisk forskning fandt udviklerne hos Oracle nogle få fejl i designet af Serialization-proceduren, som udgør en trussel mod dataene.

I 1997,Mark Reinhold siger - “ Vi kalder gerne serialisation 'den gave, der fortsætter med at give', og den type gave, den fortsætter med at give, er sikkerhedssårbarheder. Sandsynligvis har en tredjedel af alle Java-sårbarheder involveret serialisering, det kan være over halvdelen. Det er en forbavsende kilde til sårbarheder, for ikke at nævne ustabilitet. ”.

Der er chancer for, at serialisering ville blive fjernet eller erstattet i de kommende opdateringer af Java og på den anden side for en nybegynder i Java, Serialization kunne ikke være en idealistisk mulighed i deres projekter

Bedste fremgangsmåder, når du bruger serialisering i Java

Følgende er et par bedste fremgangsmåder, der skal følges

  • Det anbefales at bruge det javadoc @ serielt tag til betegnelse af Serialiserbare felter.
  • Det .at være udvidelse foretrækkes til at blive brugt til filer, der repræsenterer serieobjekter.
  • Det anbefales ikke at gennemgå statiske eller forbigående felter standard serialisering.
  • Udvidelige klasser skal ikke serialiseres, medmindre det er tilfældet obligatorisk.
  • Indre klasser bør undgås for at blive involveret i serialisering.

Med dette er vi kommet til slutningen af ​​denne artikel. Jeg håber, du har forstået det grundlæggende i Serialization i Java, dets typer og dets funktionaliteter.

Tjek den af Edureka, et pålideligt online læringsfirma med et netværk på mere end 250.000 tilfredse elever spredt over hele kloden. Edurekas Java J2EE- og SOA-uddannelses- og certificeringskursus er designet til studerende og fagfolk, der ønsker at være Java-udvikler. Kurset er designet til at give dig et forspring i Java-programmering og træne dig til både kerne- og avancerede Java-koncepter sammen med forskellige Java-rammer som Hibernate & Forår .

Har du et spørgsmål til os? Nævn det i kommentarfeltet i denne artikel 'Serialisering i Java', og vi vender tilbage til dig hurtigst muligt.