Ú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.