Hva er begrepet Serialization i Java?



Denne artikkelen vil hjelpe deg med en omfattende tilnærming til begrepet serialisering i Java sammen med sanntidseksempler for bedre forståelse.

Serialisering i er et viktig konsept som handler om konvertering av objekter til en byte-strøm for å transportere java-objektene fra en Java Virtual Machine til den andre og gjenskape dem til den opprinnelige formen. Jeg vil stille opp docket for denne artikkelen som nedenfor:

Hva er serialisering i Java?

Serialisering i Java er prosessen med å konvertere Java-koden Gjenstand inn i en Byte Stream , for å overføre objektkoden fra en Java Virtual-maskin til en annen og gjenskape den ved hjelp av Deserialisering.





Serialization-in-Java-Edureka-Picture-1

Hvorfor trenger vi serialisering i Java ?

Vi trenger serialisering av følgende årsaker:



  • Kommunikasjon : Serialisering innebærer prosedyren for objektet serialisering og overføring. Dette gjør det mulig for flere datasystemer å designe, dele og utføre objekter samtidig.

  • Caching : Tiden det tar å bygge et objekt er mer sammenlignet med tiden det tar å avserialisere det. Serialisering minimerer tidsforbruket med caching de gigantiske objektene.

  • Dyp kopi : Kloning prosessen er gjort enkel ved bruk av Serialization. Et nøyaktig replika av et objekt oppnås vedserialisere objektet til en byte-array , og deretter avserialisere den.



  • Kryss JVM-synkronisering: Den største fordelen med Serialization er at denfungerer på tvers av forskjellige JVM-er som kan kjøre på forskjellige arkitekturer eller Operativsystemer

  • Standhaftighet: Tilstanden til ethvert objekt kan lagres direkte ved å bruke Serialization på den og lagres i en database slik at det kan være hentet senere.

Hvordan serialiserer vi et objekt?

TIL Java-objekt er kan serialiseres hvis og bare hvis klassen eller noen av foreldreklassene implementerer enten java . Jeg . Serialiserbar grensesnitt eller dets undergrensesnitt, java.io. kan utvides.

I Serialization-prosessen konverterer vi et objekts tilstand til en byte-strøm, slik at den kan overføres fra en JVM til den andre og tilbakeføre byte-strømmen tilbake til det opprinnelige objektet.

// Grensesnitt

pakke Serial1 import java.io.Serialiserbar offentlig klasse Medarbeidere implementerer Serialiserbar {privat statisk endelig lang serialVersionUID = 1L // Seriell versjon UID int id Stringnavn offentlig Medarbeider (int id, String name) {this.id = id this.name = name }}

// Serialiser

pakke Serial1 import java.io. * class Persist {public static void main (String args []) {try {Employee emp1 = new Employee (20110, 'John') Employee emp2 = new Employee (22110, 'Jerry') Employee emp3 = ny ansatt (20120, 'Sam') FileOutputStream fout = ny FileOutputStream ('output.txt') ObjectOutputStream ut = ny ObjectOutputStream (fout) out.writeObject (emp1) out.writeObject (emp2) out.writeObject (emp3) ut. flush () out.close () System.out.println ('Serialisering og deserialisering er vellykket utført')} fangst (Unntak e) {System.out.println (e)}}}

Produksjon:

Serialisering og deserialisering er vellykket utført

Deserialisering : Det er den omvendte prosessen med Serialization der Serialized Byte Stream av et objekt fra avsenderen blir gjenskapt i mottakersiden.

// Deserialiser

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

Produksjon:

20110 John
22110 Jerry

20120 Sam

Fordeler og ulemper ved serialisering i Java

Fordeler:

  • Serialiseringsprosessen er en innebygd funksjon som ikke krever programvare fra tredjepart for å utføre serialisering
  • Serialiseringsprosedyren er bevist enkel og lett å forstå

  • Serialiseringsprosedyren er universell og utviklere med forskjellig bakgrunn er kjent med det

  • Det er enkelt å bruke og enkel å tilpasse

  • Serialiserte datastrømmer støtte kryptering, komprimering, autentisering og sikker Java-databehandling

  • Det er mange kritiske teknologier stole på serialisering.

Ulemper:

  • Objekter mens DeSerialization blir skjør og de er ikke sikre på å bli deSerialized effektivt.

  • De forbigående variablene deklarert mens serialisering skaper minne, men konstruktøren blir ikke kalt, noe som resulterer i feil i initialiseringen av forbigående variabler som resulterer i en variasjon til Standard Java Flow.

  • Prosessen med serialisering er ineffektiv når det gjelder minneutnyttelse.

  • Serialisering er ikke å foretrekke for bruk i applikasjonene som trenger det samtidig tilgang uten krav om tredjeparts APIer , ettersom Serialization ikke tilbyr noen overgangskontrollmekanisme per hvert SE.

  • Serialiseringsprosedyren tilbyr ikke finkornet kontroll for å få tilgang til objekter.

    hva er synkronisering i java

Praktiske eksempler på serialisering i Java

Serialisering ved hjelp av arv

Tilfelle - 1: Hvis Superclass kan serialiseres, kan subklassene som standard også serialiseres.

I dette tilfellet underklasse kan serialiseres som standard hvis superklasse implementerer Serialiserbart grensesnitt

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 offentlig A (int i) {this.i = i}} klasse B utvider A {int j offentlig B (int i, int j) {super (i) this.j = j}} offentlig klasse Test {offentlig statisk ugyldig hoved (String [] args) kaster Unntak {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 seriellisert') FileInputStream fis = new FileInputStream ('abc.ser') ObjectInputStream ois = ny ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('Objektet er deserialisert') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Produksjon:

j = 20
Objektet er seriellisert
Objektet er deserialisert
jeg = 200
j = 400

Tilfelle - 2: En underklasse kan serieiseres hvis den implementerer Serializable Interface selv om en Superclass ikke implementerer Serializable Interface.

I dette tilfellet, hvis superklasse implementerer ikke Serialiserbart grensesnitt deretter objektene til underklasse kan serieiseres manuelt ved å 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 ('Superklass konstruktør kalt')}} klasse underklasse utvider 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) kaster Unntak {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 seriellisert') FileInputStream fis = new FileInputStream ('output.ser') ObjectInputStream ois = new ObjectInputStream (fis) subclass b2 = (subclass) ois.readObject ( ) ois.close () fis.close () System.out.println ('Objektet er deserialisert') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Objektet er seriellisert
Superklassekonstruktør ringte
Objektet er deserialisert
jeg = 50
j = 20

Tilfelle - 3: Hvis superklassen kan serienummeres, men vi ikke trenger at underklassen skal serienummeres.

I dette tilfellet kan serialisering av underklassen forhindresved å implementere writeObject () og readObject () metoder i underklassen, og den må kaste NotSerializableException fra disse metodene.

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 Foreløpige implementeringer i public Parent (int i) {this.i = i}} class child extends Parent {int j public child (int i, int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) kaster IOException {throw new NotSerializableException ()} private void readObject (ObjectInputStream in) kaster 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 ('Object har blitt seriellisert ') FileInputStream fis = new FileInputStream (' abc.ser ') ObjectInputStream ois = new ObjectInputStream (fis) child b2 = (child) ois.readObject () ois.close () fis.close () System.out. println ('Objekt er deserialisert') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Produksjon:

jeg = 100
j = 200
Unntak i tråd 'hoved' java.io.NotSerializableException
på SerializationInheritance.child.writeObject (test3.java:48)
ved sol.refleksjon.NativeMethodAccessorImpl.invoke0 (Native Method)

Serialisering ved hjelp av et statisk medlem

Serialisering av statisk medlemsfelt ignoreres i prosessen med serialisering. Serialisering errelatert til objektets siste tilstand. Derfor er bare dataene knyttet til en bestemt forekomst av en klasseseriell, men ikke feltet Statisk medlem.

pakke stati import java.io. * klasse StaticSerial implementerer Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('At the Serialization, statisk medlem har verdi: '+ 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 ('Etter deserialisering har statisk medlem verdi:' + i)} fange (Unntak e) {System.out.println (e)}}}

Produksjon:

På tidspunktet for serialisering har statisk medlem verdi: 100
Etter deserialisering har statisk medlem verdi: 99

Eksterniserbart grensesnitt

De Eksterniserbart grensesnitt i Java ligner Serialization, men den eneste forskjellen er at den er i stand til å tilby tilpasset serialisering hvor du får bestemme gjenstandene som skal sores i strømmen.

Det eksterniserbare grensesnittet er tilgjengelig på java.io, og det har to metoder:

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

Hovedforskjellene mellom serialisering og eksternalisering er som følger:

c ++ flette sorteringskode
  • Gjennomføring : Eksterniserbart grensesnitt unntar brukeren det eksplisitt nevn gjenstandene som skal serienummeres. Mens i Serialization Interface, er alle objekter og variabler seriell i kjøretid.

  • Metoder : Eksterniserbart grensesnitt består av to metoder, nemlig:

    • writeExternal ()

    • readExternal ()

Mens Serializable Interface ikke inkluderer noen metoder.

  • Prosess: Serialiseringsprosessen i eksterniserbart grensesnitt gir tilpasning til serialiseringsprosessen. Men Serialization Interface vil gi misligholde serieiseringsprosess.

  • Bakoverkompatibilitet og kontroll: Eksterniserbart grensesnitt støtter serialisering uavhengig av versjonskontroll og det eneste problemet er at brukeren må være ansvarlig når han serialiserer Super Class. På den annen side krever Serialization Interface samme versjon av JVM-er i begge ender, men den inkluderer automatisk serialisering av alle objekter og klasser inkludert superklassen.

  • Offentlig No-Arg Constructor: Behov for eksternaliseringsgrensesnitt Offentlig No-Arg Constructor for å rekonstruere det serielle objektet. Mens Serialization Interface ikke krever No-Arg Constructor, bruker den i stedet speilbilde for å rekonstruere den serieiserte gjenstanden eller klassen.

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 ut = ny ObjectOutputStream (fil) ut .writeObject (object) out.close () file.close () System.out.println ('Object has 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) in.readObject () in.close () file.close () System.out.println ('Object has been deserialisert ') 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')}}}

Transient Keyword

Transient Keyword er en reservert nøkkelord i Java. Det brukes som en variabel endre på tidspunktet for serialiseringsprosessen. Å erklære en variabel med forbigående søkeord unngår at variabelen blir serialisert.

Seriell versjon UID

Før serieiseringsprosessen begynner, blir hver serie / klasse som klassifiseres som objekt assosiert med en unikt identifikasjonsnummer levert av JVM på vertsmaskinen. Denne unike IDen kalles Seriell versjon UID . Denne UID-en brukes som en identifikasjon av mottakerenden av JVM for å bekrefte at det samme objektet blir deSerialized i mottakersiden.

Kontroverser om serialisering i Java

Oracle’s Arkitekter har til hensikt å fjerne Serialization fra Java da de anser det som en Horrible Mistake of 1997 . Etter hektisk forskning fant utviklerne på Oracle noen feil ved utformingen av Serialization-prosedyren som utgjør en trussel mot dataene.

I 1997,Mark Reinhold sier - “ Vi kaller serialisering for «gaven som fortsetter å gi», og typen gave den fortsetter å gi er sikkerhetsproblemer. Trolig har en tredjedel av alle Java-sårbarheter involvert serialisering, det kan være over halvparten. Det er en forbløffende fecund kilde til sårbarheter, for ikke å nevne ustabilitet. ”.

Det er sjanser for at Serialization vil bli fjernet eller erstattet i de kommende oppdateringene av Java og på den annen side, for en nybegynner i Java, Serialization kunne ikke være et idealistisk alternativ i sine prosjekter

Beste fremgangsmåter når du bruker serialisering i Java

Følgende er noen gode fremgangsmåter som må følges

  • Det anbefales bruk javadoc @ seriell tag for å betegne Serializable-felt.
  • De .å være utvidelse er å bruke for filer som representerer serieobjekter.
  • Det anbefales ikke at noen statiske eller forbigående felt gjennomgår standard serialisering.
  • Utvidbare klasser skal ikke Serialiseres med mindre det er det påbudt, bindende.
  • Indre klasser bør unngås for å være involvert i serialisering.

Med dette har vi kommet til slutten av denne artikkelen. Jeg håper du har forstått det grunnleggende om Serialization i Java, dets typer og dets funksjoner.

Sjekk ut av Edureka, et pålitelig online læringsfirma med et nettverk av mer enn 250 000 fornøyde elever spredt over hele verden. Edurekas Java J2EE- og SOA-opplæring og sertifiseringskurs er designet for studenter og fagpersoner som ønsker å være Java-utvikler. Kurset er designet for å gi deg et forsprang i Java-programmering og trene deg for både kjerne- og avanserte Java-konsepter sammen med forskjellige Java-rammer som Hibernate & Vår .

Har du et spørsmål til oss? Nevn det i kommentarfeltet i denne 'Serialization in Java' -artikkelen, så kommer vi tilbake til deg så snart som mulig.