Útmutató a Java külsõ felületéhez

1. Bemutatkozás

Ebben az oktatóanyagban gyorsan megnézzük a java-okat java.io.Externalizálható felület. Ennek a felületnek a fő célja az egyedi sorosítás és a deserializáció megkönnyítése.

Mielőtt továbblépnénk, győződjön meg róla, hogy megnézte a sorosítást a Java cikkben. A következő fejezet arról szól, hogyan lehet egy Java objektumot sorosítani ezzel az interfésszel.

Ezt követően megvitatjuk a legfontosabb különbségeket a java.io.Serializálható felület.

2. A Külsőleges Felület

Külsőleges kiterjed a java.io.Serializálható marker interfész. Bármely osztály, amely megvalósítja Külsőleges felület felülírja a writeExternal (), readExternal () mód. Így megváltoztathatjuk a JVM alapértelmezett sorosítási viselkedését.

2.1. Serializálás

Vessünk egy pillantást erre az egyszerű példára:

public class Ország megvalósítja az Externalizable {private static final long serialVersionUID = 1L; privát karakterlánc neve; privát int kód; // getters, setters @Override public void writeExternal (ObjectOutput out) dobja az IOException {out.writeUTF (név); out.writeInt (kód); } @Orride public void readExternal (ObjectInput in) dobja az IOException, ClassNotFoundException {this.name = in.readUTF (); this.code = in.readInt (); }}

Itt meghatároztunk egy osztályt Ország hogy megvalósítja a Külsőleges interfészt és megvalósítja a fent említett két módszert.

Ban,-ben writeExternal () módszerrel hozzáadjuk az objektum tulajdonságait a ObjectOutput folyam. Ennek szokásos módszerei vannak, mint pl writeUTF () mert Húr és writeInt () az int értékekre.

Következő, az objektum deserializálásához a ObjectInput folyam használni a readUTF (), readInt () módszerek a tulajdonságok elolvasására ugyanabban a sorrendben, ahogyan írták.

Jó gyakorlat hozzáadni a serialVersionUID manuálisan. Ha ez hiányzik, a JVM automatikusan hozzáad egyet.

Az automatikusan létrehozott szám a fordítótól függ. Ez azt jelenti, hogy valószínűtlen InvalidClassException.

Teszteljük a fentiekben alkalmazott viselkedést:

@Test public void whenSerializing_thenUseExternalizable () IOException, ClassNotFoundException {Country c = new Country (); c.setCode (374); c.setName ("Örményország"); FileOutputStream fileOutputStream = új FileOutputStream (OUTPUT_FILE); ObjectOutputStream objectOutputStream = új ObjectOutputStream (fileOutputStream); c.writeExternal (objectOutputStream); objectOutputStream.flush (); objectOutputStream.close (); fileOutputStream.close (); FileInputStream fileInputStream = új FileInputStream (OUTPUT_FILE); ObjectInputStream objectInputStream = új ObjectInputStream (fileInputStream); Ország c2 = új ország (); c2.readExternal (objectInputStream); objectInputStream.close (); fileInputStream.close (); assertTrue (c2.getCode () == c.getCode ()); assertTrue (c2.getName (). egyenlő (c.getName ())); }

Ebben a példában először a Ország objektumot, és fájlba írja. Ezután deserializáljuk az objektumot a fájlból, és ellenőrizzük, hogy az értékek helyesek-e.

A kinyomtatott kimenet c2 tárgy:

Ország {name = 'Örményország', code = 374}

Ez azt mutatja, hogy sikeresen deserializáltuk az objektumot.

2.2. Öröklés

Amikor egy osztály örököl a Sorosítható felületen a JVM automatikusan összegyűjti az összes mezőt az alosztályokból is, és sorosíthatóvá teszi őket.

Ne feledje, hogy ezt alkalmazhatjuk Külsőleges is. Csak be kell vezetnünk az olvasási / írási módszereket az öröklési hierarchia minden alosztályára.

Nézzük meg a Vidék osztály, amely alatt kiterjeszti a mi Ország osztály az előző szakaszból:

nyilvános osztály A régió kiterjeszti az országot megvalósítja az externálható {private static végső hosszú serialVersionUID = 1L; privát String klíma; magán kettős lakosság; // getters, setters @Orride public void writeExternal (ObjectOutput out) kidobja az IOException-t {super.writeExternal (out); out.writeUTF (éghajlat); } @Orride public void readExternal (ObjectInput in) dobja az IOException, ClassNotFoundException {super.readExternal (in); this.climate = in.readUTF (); }}

Itt két további tulajdonságot adtunk hozzá, és az elsőt sorosítottuk.

Vegye figyelembe, hogy telefonáltunk is super.writeExternal (out), super.readExternal (in) a serializer módszereken belül a szülő osztály mezők mentésére / visszaállítására is.

Futtassuk az egység tesztet a következő adatokkal:

R régió = új régió (); r.setCode (374); r.setName ("Örményország"); r.setClimate ("mediterrán"); r.setPopulation (120.000);

Itt van a deszerializált objektum:

Régió {country = "Ország {name =" Örményország ", code = 374} 'éghajlat =" mediterrán ", népesség = null}

Figyelje meg mivel nem sorosítottuk a népesség mező ben Vidék osztályban az adott tulajdonság értéke nulla.

3. Külsőleges vs. Sorosítható

Nézzük át a két interfész közötti legfontosabb különbségeket:

  • Sorosítási felelősség

A legfontosabb különbség itt az, hogy miként kezeljük a sorosítási folyamatot. Amikor egy osztály végrehajtja a java.io.Serializálható felületen a JVM teljes felelősséget vállal az osztálypéldány sorosításáért. Esetében Külső, a programozónak kell gondoskodnia az egész sorosítási és deserializációs folyamatról.

  • Használjon esetet

Ha a teljes objektumot sorosítani kell, akkor a Sorosítható interfész jobban illik. Másrészről, az egyedi sorosításhoz a folyamatot vezérelhetjük Külsőleges.

  • Teljesítmény

A java.io.Serializálható az interfész tükrözést és metaadatokat használ, ami viszonylag lassú teljesítményt okoz. Ehhez képest: Külsőleges Az interfész teljes ellenőrzést biztosít a szerializációs folyamat felett.

  • Olvasási sorrend

Használat közben Külsőleges, kötelező az összes mezőállapotot a pontos sorrendben elolvasni, ahogy írták. Ellenkező esetben kivételt kapunk.

Például, ha megváltoztatjuk a kód és név tulajdonságai a Ország A osztály java.io.EOFException dobni fogják.

Közben a Sorosítható az interfésznek nincs ilyen követelménye.

  • Egyéni sorosítás

Egyedi sorosítást érhetünk el a Sorosítható felületet a mező jelölésével átmeneti kulcsszó. A JVM nem sorosítja az adott mezőt, de összeadja a mezőt a fájlok tárolására az alapértelmezett értékkel. Ezért jó a használata Külsőleges egyedi sorosítás esetén.

4. Következtetés

Ebben a rövid útmutatóban a Külsőleges felületen megvitattuk a legfontosabb jellemzőket, előnyöket és bemutattuk az egyszerű használat példáit. Összehasonlítottunk a Sorosítható felület.

Szokás szerint az oktatóanyag teljes forráskódja elérhető a GitHubon.