Sprievodca externalizovateľným rozhraním v jazyku Java

1. Úvod

V tomto návode rýchlo sa pozrieme na java java.io.Externalizable rozhranie. Hlavným cieľom tohto rozhrania je uľahčiť vlastnú serializáciu a deserializáciu.

Než začneme, nezabudnite si pozrieť serializáciu v článku Java. Ďalšia kapitola je o tom, ako serializovať objekt Java pomocou tohto rozhrania.

Potom budeme diskutovať o hlavných rozdieloch v porovnaní s java.io. Serializovateľné rozhranie.

2. The Externalizovateľné Rozhranie

Externalizovateľné siaha od java.io. Serializovateľné značkovacie rozhranie. Akákoľvek trieda, ktorá implementuje Externalizovateľné rozhranie by malo prepísať writeExternal (), readExternal () metódy. Týmto spôsobom môžeme zmeniť predvolené správanie serializácie JVM.

2.1. Serializácia

Pozrime sa na tento jednoduchý príklad:

verejná trieda Country implementuje Externalizable {private static final long serialVersionUID = 1L; súkromné ​​meno reťazca; súkromný int kód; // getters, setters @Override public void writeExternal (ObjectOutput out) hodí IOException {out.writeUTF (name); out.writeInt (kód); } @Override public void readExternal (ObjectInput in) vyvolá IOException, ClassNotFoundException {this.name = in.readUTF (); this.code = in.readInt (); }}

Tu sme definovali triedu Krajina ktorý vykonáva Externalizovateľné rozhranie a implementuje dve vyššie spomenuté metódy.

V writeExternal () metódou, pridávame vlastnosti objektu do ObjectOutput Prúd. Toto má štandardné metódy ako writeUTF () pre String a writeInt () pre hodnoty int.

Ďalšie, za deserializáciu objektu čítame z ObjectInput Prúd pomocou readUTF (), readInt () metódy na čítanie vlastností v rovnakom presnom poradí, v akom boli napísané.

Je dobrým zvykom pridať serialVersionUID ručne. Ak to chýba, JVM automaticky pridá jeden.

Automaticky generované číslo závisí od prekladača. To znamená, že to môže spôsobiť nepravdepodobnosť InvalidClassException.

Vyskúšajme správanie, ktoré sme implementovali vyššie:

@ Test public void whenSerializing_thenUseExternalizable () vyvolá IOException, ClassNotFoundException {Country c = new Country (); c.setCode (374); c.setName ("Arménsko"); FileOutputStream fileOutputStream = nový FileOutputStream (OUTPUT_FILE); ObjectOutputStream objectOutputStream = nový ObjectOutputStream (fileOutputStream); c.writeExternal (objectOutputStream); objectOutputStream.flush (); objectOutputStream.close (); fileOutputStream.close (); FileInputStream fileInputStream = nový FileInputStream (OUTPUT_FILE); ObjectInputStream objectInputStream = nový ObjectInputStream (fileInputStream); Krajina c2 = nová krajina (); c2.readExternal (objectInputStream); objectInputStream.close (); fileInputStream.close (); assertTrue (c2.getCode () == c.getCode ()); assertTrue (c2.getName (). equals (c.getName ())); }

V tomto príklade najskôr vytvárame a Krajina objekt a zapíše ho do súboru. Potom deserializujeme objekt zo súboru a overíme, či sú hodnoty správne.

Výstup tlačeného c2 objekt:

Krajina {name = 'Arménsko', kód = 374}

To ukazuje, že sme objekt úspešne deserializovali.

2.2. Dedenie

Keď trieda dedí z Serializovateľné rozhranie, JVM automaticky zhromažďuje tiež všetky polia z podtried a robí ich serializovateľnými.

Pamätajte, že to môžeme použiť na Externalizovateľné tiež. Musíme len implementovať metódy čítania a zápisu pre každú podtriedu hierarchie dedičstva.

Pozrime sa na Región triedy, pod ktorou sa rozširuje naša Krajina trieda z predchádzajúcej časti:

public class Region extends Country implements Externalizable {private static final long serialVersionUID = 1L; súkromná strunová klíma; súkromné ​​dvojité obyvateľstvo; // getters, setters @Override public void writeExternal (ObjectOutput out) hodí IOException {super.writeExternal (out); out.writeUTF (podnebie); } @Override public void readExternal (ObjectInput in) hodí IOException, ClassNotFoundException {super.readExternal (in); this.climate = in.readUTF (); }}

Tu sme pridali dve ďalšie vlastnosti a serializovali prvé.

Poznač si to aj sme volali super.writeExternal (out), super.readExternal (in) v rámci metód serializátora tiež uložiť / obnoviť polia nadradenej triedy.

Spustíme test jednotky s nasledujúcimi údajmi:

Región r = nový Región (); r.setCode (374); r.setName ("Arménsko"); r.setClimate ("Stredomorie"); r.setPopulation (120 000);

Tu je deserializovaný objekt:

Región {country = "Krajina {name =" Arménsko ", kód = 374} 'podnebie =" Stredomorie ", populácia = null}

Všimni si pretože sme neserializovali populácia pole v Región triedy, hodnota tejto vlastnosti je nulový.

3. Externalizovateľné vs Serializovateľné

Prejdime si kľúčové rozdiely medzi týmito dvoma rozhraniami:

  • Zodpovednosť za serializáciu

Kľúčovým rozdielom je, ako postupujeme pri procese serializácie. Keď trieda implementuje java.io. Serializovateľné rozhranie, JVM preberá plnú zodpovednosť za serializáciu inštancie triedy. V prípade Externalizovateľné, je to programátor, ktorý by sa mal postarať o celý proces serializácie a tiež deserializácie.

  • Prípad použitia

Ak potrebujeme serializovať celý objekt, Serializovateľné rozhranie je vhodnejšie. Na druhej strane, pre vlastnú serializáciu môžeme proces riadiť pomocou Externalizovateľné.

  • Výkon

The java.io. Serializovateľné rozhranie používa reflexiu a metadáta, čo spôsobuje relatívne nízky výkon. Na porovnanie Externalizovateľné rozhranie vám dáva plnú kontrolu nad procesom serializácie.

  • Objednávka na čítanie

Počas používania Externalizovateľné, je povinné čítať všetky stavy polí v presnom poradí, v akom boli napísané. V opačnom prípade dostaneme výnimku.

Napríklad ak zmeníme poradie čítania súboru kód a názov nehnuteľnosti v Krajina trieda, a java.io.EOFException bude vyhodený.

Medzitým Serializovateľné rozhranie túto požiadavku nemá.

  • Vlastná serializácia

Vlastnú serializáciu môžeme dosiahnuť pomocou Serializovateľné rozhranie označením poľa pomocou prechodný kľúčové slovo. JVM nebude serializovať konkrétne pole, ale pridá pole do ukladacieho priestoru súborov s predvolenou hodnotou. Preto je dobré používať tento postup Externalizovateľné v prípade vlastnej serializácie.

4. Záver

V tomto krátkom sprievodcovi po Externalizovateľné sme si rozobrali kľúčové vlastnosti, výhody a demonštrovali príklady jednoduchého použitia. Urobili sme tiež porovnanie s Serializovateľné rozhranie.

Celý zdrojový kód tutoriálu je ako obvykle k dispozícii na stránkach GitHub.


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