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.


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