Bevezetés a Kryo-ba

1. Áttekintés

A Kryo egy Java sorosítási keretrendszer, amelynek középpontjában a sebesség, a hatékonyság és a felhasználóbarát API áll.

Ebben a cikkben megvizsgáljuk a Kryo keretrendszer legfontosabb jellemzőit, és példákat valósítunk meg annak képességeinek bemutatásához.

2. Maven-függőség

Az első dolog, amit meg kell tennünk, az a kryo függőség a mi pom.xml:

 com.esotericsoftware kryo 4.0.1 

A műtárgy legújabb verziója a Maven Central oldalon található.

3. Kryo alapjai

Kezdjük azzal, hogy megnézzük, hogyan működik a Kryo, és hogyan tudjuk vele sorosítani és deserializálni az objektumokat.

3.1. Bevezetés

A keret biztosítja a Kryo osztály minden funkciójának fő belépési pontjaként.

Ez az osztály vezeti a sorosítási folyamatot, és az osztályokat hozzárendeli Serializer olyan példányok, amelyek kezelik az objektum grafikonjának byte ábrázolássá alakításának részleteit.

Miután a bájtok elkészültek, egy stream segítségével írják őket egy adatfolyamra Kimenet tárgy. Így tárolhatók fájlokban, adatbázisokban vagy továbbíthatók a hálózaton keresztül.

Később, amikor az objektumra szükség van, egy Bemenet példányt használjuk ezeknek a bájtoknak az olvasására és Java objektumokká dekódolására.

3.2. Objektumok sorosítása

Mielőtt belemerülnénk a példákba, először hozzunk létre egy segédprogram-módszert néhány változó inicializálásához, amelyeket a cikk minden tesztesetéhez használunk:

@A nyilvános void előtt init () {kryo = new Kryo (); output = new Output (új FileOutputStream ("file.dat")); input = new Input (új FileInputStream ("file.dat")); }

Most megnézhetjük, mennyire egyszerű egy objektumot írni és olvasni a Kryo használatával:

@Test public void givenObject_whenSerializing_thenReadCorrectly () {Object someObject = "Néhány karakterlánc"; kryo.writeClassAndObject (output, someObject); output.close (); Objektum theObject = kryo.readClassAndObject (input); input.close (); assertEquals (theObject, "Néhány karakterlánc"); }

Figyelje meg a Bezárás() módszer. Erre szükség van azóta Kimenet és Bemenet osztályok öröklik OutputStream és InputStream illetőleg.

Több objektum sorosítása hasonlóan egyszerű:

@Test public void givenObjects_whenSerializing_thenReadCorrectly () {String someString = "Több objektum"; Dátum someDate = új dátum (915170400000L); kryo.writeObject (output, someString); kryo.writeObject (output, someDate); output.close (); String readString = kryo.readObject (input, String.class); Dátum readDate = kryo.readObject (input, Date.class); input.close (); assertEquals (readString, "Több objektum"); assertEquals (readDate.getTime (), 915170400000L); }

Figyelje meg, hogy a megfelelő osztályt átadjuk a readObject () módszerrel, ez a kódunkat cast-mentessé teszi.

4. Sorosítók

Ebben a részben megmutatjuk, hogy melyik Sorosítók már elérhetők, majd létrehozzuk a sajátunkat.

4.1. Alapértelmezett sorosítók

Amikor a Kryo sorosít egy objektumot, létrehoz egy korábban regisztrált példányt Serializer osztály elvégzi a bájtokká való átalakítást. Ezeket alapértelmezett sorosítóknak hívjuk, és részünkről bármilyen beállítás nélkül használhatók.

A könyvtárban már több olyan sorosító található, amelyek primitíveket, listákat, térképeket, listákat stb. Dolgoznak fel. Ha egy adott osztályhoz nem található sorosító, akkor egy FieldSerializer használatos, amely szinte bármilyen típusú objektumot képes kezelni.

Lássuk, hogyan néz ki ez. Először hozzuk létre a Személy osztály:

public class Személy {private String név = "John Doe"; privát int kor = 18; privát születési dátum = új dátum (933191282821L); // szabványos kivitelezők, mérőeszközök és beállítók}

Most írjunk egy objektumot ebből az osztályból, majd olvassuk vissza:

@Test public void givenPerson_whenSerializing_thenReadCorrectly () {Személy személy = új Személy (); kryo.writeObject (kimenet, személy); output.close (); Person readPerson = kryo.readObject (input, Személy.osztály); input.close (); assertEquals (readPerson.getName (), "John Doe"); }

Figyelje meg, hogy nem kellett semmit megadnunk a Személy tárgy, mivel a FieldSerializer automatikusan létrejön számunkra.

4.2. Egyéni Serializátorok

Ha nagyobb ellenőrzésre van szükségünk a sorosítási folyamat felett, két lehetőségünk van; megírhatjuk a sajátunkat Serializer osztályt, és regisztrálja a Kryo-nál, vagy hagyja, hogy az osztály maga kezelje a sorosítást.

Az első lehetőség bemutatásához hozzunk létre egy kiterjesztő osztályt Serializer:

public class PersonSerializer kiterjeszti a Serializer {public void write (Kryo kryo, Output output, Person objektum) {output.writeString (object.getName ()); output.writeLong (object.getBirthDate (). getTime ()); } public Person read (Kryo kryo, Input input, Class type) {Személy személy = új Személy (); person.setName (input.readString ()); hosszú születési dátum = input.readLong (); person.setBirthDate (új dátum (születési dátum)); person.setAge (calcAge (birthDate)); visszatérő személy; } private int calcAge (long birthDate) {// Néhány egyéni logika 18-at ad vissza; }}

Most tegyük próbára:

@Test public void givenPerson_whenUsingCustomSerializer_thenReadCorrectly () {Személy személy = új Személy (); person.setAge (0); kryo.register (Személyosztály, új PersonSerializer ()); kryo.writeObject (kimenet, személy); output.close (); Person readPerson = kryo.readObject (input, Személy.osztály); input.close (); assertEquals (readPerson.getName (), "John Doe"); assertEquals (readPerson.getAge (), 18); }

Figyeljük meg, hogy a kor mező értéke 18, annak ellenére, hogy korábban 0-ra állítottuk.

Használhatjuk a @ DefaultSerializer kommentár, hogy tudassa Kryo-val, hogy a PersonSerializer minden alkalommal, amikor kezelnie kell a Személy tárgy. Ez segít elkerülni a Regisztráció() módszer:

@DefaultSerializer (PersonSerializer.class) public class Person végrehajtja a KryoSerializable {// ...}

A második opcióhoz módosítsuk a Személy osztály meghosszabbítja a KryoSerializable felület:

public class Személy végrehajtja a KryoSerializable {// ... public void write (Kryo kryo, Output output) {output.writeString (név); // ...} public void read (Kryo kryo, Input input) {név = input.readString (); // ...}}

Mivel ennek a lehetőségnek a tesztesete megegyezik egy előzővel, itt nem szerepel. Megtalálhatja azonban a cikk forráskódjában.

4.3. Java Serializer

Sporadikus esetekben Kryo nem fogja tudni sorosítani az osztályt. Ha ez megtörténik, és az egyéni szerializáló írása nem opció, akkor a szabványos Java szerializációs mechanizmust használhatjuk az a használatával JavaSerializer. Ehhez meg kell, hogy az osztály hajtsa végre a Sorosítható felület a szokásos módon.

Íme egy példa, amely a fent említett sorosítót használja:

public class ComplexObject megvalósítja a Serializable {private String name = "Bael"; // szabványos mérőeszközök és beállítók}
@Test public void givenJavaSerializable_whenSerializing_thenReadCorrectly () {ComplexClass complexObject = new ComplexClass (); kryo.register (ComplexClass.class, új JavaSerializer ()); kryo.writeObject (output, complexObject); output.close (); ComplexClass readComplexObject = kryo.readObject (input, ComplexClass.class); input.close (); assertEquals (readComplexObject.getName (), "Bael"); }

5. Következtetés

Ebben az oktatóanyagban a Kryo könyvtár legfigyelemreméltóbb jellemzőit tártuk fel.

Több egyszerű objektumot sorosítottunk és a FieldSerializer osztály foglalkozni egy egyedi. Létrehoztunk egy egyedi sorosítót is, és bemutattuk, hogyan lehet szükség esetén a szokásos Java szerializációs mechanizmust használni.

Mint mindig, a cikk teljes forráskódja megtalálható a Github oldalon.


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