Vejledning til det eksterniserbare interface i Java

1. Introduktion

I denne vejledning vi kigger hurtigt på java's java.io. kan udvides interface. Hovedmålet med denne grænseflade er at lette tilpasset serialisering og deserialisering.

Før vi går videre, skal du sørge for at tjekke serialiseringen i Java-artiklen. Det næste kapitel handler om, hvordan man serierer et Java-objekt med denne grænseflade.

Derefter skal vi diskutere de vigtigste forskelle i forhold til java.io.Serialiserbar interface.

2. Den Eksternaliserbar Interface

Eksternaliserbar strækker sig fra java.io.Serialiserbar markørgrænseflade. Enhver klasse, der gennemføres Eksternaliserbar interface skal tilsidesætte writeExternal (), readExternal () metoder. På den måde kan vi ændre JVM's standard serialiseringsadfærd.

2.1. Serialisering

Lad os se på dette enkle eksempel:

offentlig klasse Land implementerer Eksternaliserbar {privat statisk endelig lang serialVersionUID = 1L; privat strengnavn; privat int-kode; // getters, setters @ Override public void writeExternal (ObjectOutput out) kaster IOException {out.writeUTF (navn); out.writeInt (kode); } @ Overstyr offentlig tomrum readExternal (ObjectInput in) kaster IOException, ClassNotFoundException {this.name = in.readUTF (); denne.kode = in.readInt (); }}

Her har vi defineret en klasse Land der implementerer Eksternaliserbar interface og implementerer de to ovennævnte metoder.

I writeExternal () metode, vi tilføjer objektets egenskaber til ObjectOutput strøm. Dette har standardmetoder som skrivUTF () til Snor og skrivInt () for int-værdierne.

Næste, for at deserialisere objektet læser vi fra ObjectInput strøm bruger readUTF (), readInt () metoder til at læse egenskaberne i den nøjagtige rækkefølge, som de blev skrevet i.

Det er en god praksis at tilføje serialVersionUID manuelt. Hvis dette ikke findes, tilføjer JVM automatisk en.

Det automatisk genererede nummer afhænger af kompilatoren. Dette betyder, at det kan forårsage en usandsynlig InvalidClassException.

Lad os teste den adfærd, vi implementerede ovenfor:

@Test offentlig ugyldig nårSerializing_thenUseExternalizable () kaster IOException, ClassNotFoundException {Land c = nyt land (); c.setCode (374); c.setName ("Armenien"); FileOutputStream fileOutputStream = ny FileOutputStream (OUTPUT_FILE); ObjectOutputStream objectOutputStream = ny ObjectOutputStream (fileOutputStream); c.writeExternal (objectOutputStream); objectOutputStream.flush (); objectOutputStream.close (); fileOutputStream.close (); FileInputStream fileInputStream = ny FileInputStream (OUTPUT_FILE); ObjectInputStream objectInputStream = ny ObjectInputStream (fileInputStream); Land c2 = nyt land (); c2.readExternal (objectInputStream); objectInputStream.close (); fileInputStream.close (); assertTrue (c2.getCode () == c.getCode ()); assertTrue (c2.getName (). er lig med (c.getName ())); }

I dette eksempel opretter vi først en Land gøre indsigelse og skrive det til en fil. Derefter deserialiserer vi objektet fra filen og kontrollerer, at værdierne er korrekte.

Output af det trykte c2 objekt:

Land {name = 'Armenien', kode = 374}

Dette viser, at vi med succes har deserialiseret objektet.

2.2. Arv

Når en klasse arver fra Serialiserbar interface samler JVM automatisk også alle felter fra underklasser og gør dem serielle.

Husk, at vi kan anvende dette på Eksternaliserbar såvel. Vi skal bare implementere læse / skrive-metoderne for hver underklasse i arvshierarkiet.

Lad os se på Område klasse under hvilken udvider vores Land klasse fra det foregående afsnit:

offentlig klasse Region udvider Landværktøjer Eksternaliserbare {privat statisk endelig lang serialVersionUID = 1L; privat strengklima; privat dobbeltbefolkning; // getters, setters @ Override public void writeExternal (ObjectOutput out) kaster IOException {super.writeExternal (out); out.writeUTF (klima); } @ Override public void readExternal (ObjectInput in) kaster IOException, ClassNotFoundException {super.readExternal (in); this.climate = in.readUTF (); }}

Her tilføjede vi yderligere to egenskaber og serieiserede den første.

Noter det vi kaldte også super.writeExternal (ud), super.readExternal (ind) inden for serialiseringsmetoder for også at gemme / gendanne overordnede klassefelter.

Lad os køre enhedstesten med følgende data:

Region r = ny region (); r.setCode (374); r.setName ("Armenien"); r.setClimate ("Middelhavet"); r.setPopulation (120.000);

Her er det deserialiserede objekt:

Region {country = "Country {name =" Armenia ', code = 374}' climate = "Mediterranean", population = null}

Læg mærke til det da vi ikke serieliserede befolkning felt i Område klasse er værdien af ​​denne ejendom nul.

3. Eksternaliserbar vs. Serialiserbar

Lad os gennemgå de vigtigste forskelle mellem de to grænseflader:

  • Serialiseringsansvar

Hovedforskellen her er, hvordan vi håndterer serieiseringsprocessen. Når en klasse implementerer java.io.Serialiserbar interface, tager JVM det fulde ansvar for serialisering af klasseinstansen. I tilfælde af Eksternaliserbar, det er programmøren, der skal tage sig af hele serialiserings- og deserialiseringsprocessen.

  • Brug sag

Hvis vi har brug for at serieisere hele objektet, bliver Serialiserbar interface passer bedre. På den anden side, til tilpasset serialisering kan vi styre processen ved hjælp af Eksternaliserbar.

  • Ydeevne

Det java.io.Serialiserbar interface bruger refleksion og metadata, som forårsager relativt langsom ydeevne. Til sammenligning er Eksternaliserbar interface giver dig fuld kontrol over serialiseringsprocessen.

  • Læserækkefølge

Under brug Eksternaliserbar, er det obligatorisk at læse alle felttilstande i den nøjagtige rækkefølge, som de blev skrevet. Ellers får vi en undtagelse.

For eksempel, hvis vi ændrer læserækkefølgen på kode og navn ejendomme i Land klasse, en java.io.EOFException vil blive kastet.

I mellemtiden er den Serialiserbar interface har ikke dette krav.

  • Tilpasset serialisering

Vi kan opnå tilpasset serialisering med Serialiserbar interface ved at markere feltet med forbigående nøgleord. JVM serialiserer ikke det bestemte felt, men det tilføjer feltet til fillagring med standardværdien. Derfor er det en god praksis at bruge Eksternaliserbar i tilfælde af tilpasset serialisering.

4. Konklusion

I denne korte vejledning til Eksternaliserbar interface, diskuterede vi nøglefunktionerne, fordelene og demonstrerede eksempler på enkel brug. Vi lavede også en sammenligning med Serialiserbar interface.

Som sædvanlig er den fulde kildekode for vejledningen tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found