Bevezetés a Google Protokoll pufferbe
1. Áttekintés
Ebben a cikkben a Google Protocol Buffer-t (protobuf) vesszük szemügyre, amely egy jól ismert nyelv-agnosztikus bináris adatformátum. Definiálhatunk egy fájlt egy protokollal, majd a protokoll használatával generálhatunk kódot olyan nyelveken, mint a Java, C ++, C #, Go vagy Python.
Ez egy bevezető cikk magához a formátumhoz; ha meg szeretné tudni, hogyan kell használni a formátumot egy tavaszi webalkalmazással, nézze meg ezt a cikket.
2. Maven-függőségek meghatározása
A protokollpufferek Java használatához hozzá kell adnunk egy Maven-függőséget egy protobuf-java-hoz:
com.google.protobuf protobuf-java $ {protobuf.version} 3.2.0
3. Protokoll meghatározása
Kezdjük egy példával. Meghatározhatunk egy nagyon egyszerű protokollt protobuf formátumban:
üzenet Személy {kötelező karakterlánc neve = 1; }
Ez egy egyszerű üzenet protokollja Személy típus, amelynek csak egy kötelező mezője van - név, amelynek a húr típus.
Nézzük meg a protokoll definiálásának összetettebb példáját. Tegyük fel, hogy a személy adatait protobuf formátumban kell tárolnunk:
csomag protobuf;
csomag protobuf; opció java_package = "com.baeldung.protobuf"; opció java_outer_classname = "AddressBookProtos"; üzenet Személy {kötelező karakterlánc neve = 1; szükséges int32 id = 2; választható karakterlánc = 3; ismételt karakterláncok száma = 4; } üzenet Címjegyzék {ismétlődő Személy emberek = 1; }
Protokollunk kétféle adatból áll: a Személy és egy Címjegyzék. A kód előállítása után (erről bővebben a későbbi szakaszban) ezek az osztályok a belső osztályok lesznek AddressBookProtos osztály.
Amikor meg akarunk határozni egy szükséges mezőt - ez azt jelenti, hogy egy objektum ilyen mező nélkül történő létrehozása egy Kivétel, használnunk kell a kívánt kulcsszó.
Mező létrehozása a választható kulcsszó azt jelenti, hogy ezt a mezőt nem kell beállítani. A megismételt kulcsszó egy változó méretű tömbtípus.
Az összes mező indexelésre kerül - az 1-es számmal jelölt mező első mezőként kerül mentésre egy bináris fájlban. A 2-vel jelölt mezőt ezután mentjük, és így tovább. Ez jobb kontrollt biztosít számunkra a mezők memóriában való elrendezésében.
4. Java kód generálása Protobuf fájlból
Miután definiáltunk egy fájlt, előállíthatunk belőle kódot.
Először is telepítenünk kell a protobuf-ot a gépünkre. Miután ezt megtettük, kódot generálhatunk az a végrehajtásával protokoll parancs:
protokoll -I =. --java_out =. címjegyzék.proto
A protokoll parancs generál Java kimeneti fájlt a mi címjegyzék.proto fájl. A -ÉN Az opció megad egy könyvtárat, amelyben a proto fájl található. A java-out megad egy könyvtárat, ahol a generált osztály létrejön.
A generált osztályban lesznek beállítók, mérőeszközök, konstruktorok és építők a meghatározott üzeneteinkhez. Ezenkívül tartalmaz néhány hasznos módszert a protobuf fájlok mentésére és bináris formátumból Java osztályra deszerializálására.
5. Protobuf által definiált üzenetek példányának létrehozása
Egy generált kód segítségével könnyen létrehozhatunk Java példányt a Személy osztály:
Karakterlánc e-mail = "[email protected]"; int id = new Random (). nextInt (); Karakterlánc neve = "Michael Program"; Karakterlánc száma = "01234567890"; AddressBookProtos.Person person = AddressBookProtos.Person.newBuilder () .setId (id) .setName (név) .setEmail (email) .adNNumbers (szám) .build (); assertEquals (person.getEmail (), e-mail); assertEquals (személy.getId (), id); assertEquals (person.getName (), név); assertEquals (person.getNumbers (0), szám);
Folyékony építőt hozhatunk létre az a használatával newBuilder () metódus a kívánt üzenet típusánál. Az összes kötelező mező beállítása után felhívhatjuk a épít() metódus a Személy osztály.
6. A Protobuf sorosítása és deserializálása
Miután létrehoztunk egy példányt a Személy osztályban, azt lemezre akarjuk menteni bináris formátumban, amely kompatibilis egy létrehozott protokollal. Tegyük fel, hogy létre akarjuk hozni a Címjegyzék osztály és adjon hozzá egy személyt az objektumhoz.
Ezután a fájlt lemezre akarjuk menteni - van egy írj neki() util módszer az automatikusan létrehozott kódban, amelyet felhasználhatunk:
AddressBookProtos.AddressBook addressBook = AddressBookProtos.AddressBook.newBuilder (). AddPeople (person) .build (); FileOutputStream fos = új FileOutputStream (filePath); addressBook.writeTo (fos);
A módszer végrehajtása után az objektumunkat bináris formátumba soroljuk és a lemezre mentjük. Ha ezeket az adatokat egy lemezről szeretné betölteni, és deszerializálni szeretné őket a Címjegyzék tárgyat használhatjuk a mergeFrom () módszer:
AddressBookProtos.AddressBook deserialized = AddressBookProtos.AddressBook.newBuilder () .mergeFrom (new FileInputStream (filePath)). Build (); assertEquals (deserialized.getPeople (0) .getEmail (), e-mail); assertEquals (deserialized.getPeople (0) .getId (), id); assertEquals (deserialized.getPeople (0) .getName (), név); assertEquals (deserialized.getPeople (0) .getNumbers (0), szám);
7. Következtetés
Ebben a rövid cikkben bevezettünk egy szabványt az adatok bináris formátumban történő leírására és tárolására - a Google Protocol Buffer-t.
Létrehoztunk egy egyszerű protokollt, létrehoztunk egy Java példányt, amely megfelel a meghatározott protokollnak. Ezután láttuk, hogyan lehet az objektumokat sorosítani és deserializálni a protobuf használatával.
Ezeknek a példáknak és kódrészleteknek a megvalósítása megtalálható a GitHub projektben - ez egy Maven projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.