Uvod u Google protokol za međuspremnik

1. Pregled

U ovom ćemo članku razmotriti Google Protocol Buffer (protobuf) - poznati binarni oblik podataka koji je agnozičan. Datoteku možemo definirati protokolom, a zatim pomoću tog protokola možemo generirati kod na jezicima kao što su Java, C ++, C #, Go ili Python.

Ovo je uvodni članak u sam format; ako želite vidjeti kako koristiti format s web aplikacijom Spring, pogledajte ovaj članak.

2. Utvrđivanje ovisnosti Mavena

Da bismo koristili međuspremnike protokola Java, trebamo dodati ovisnost Mavena u protobuf-javu:

 com.google.protobuf protobuf-java $ {protobuf.version} 3.2.0 

3. Definiranje protokola

Krenimo od primjera. Možemo definirati vrlo jednostavan protokol u formatu protobuf:

poruka Osoba {obavezno ime niza = 1; }

Ovo je protokol jednostavne poruke Osoba tip koji ima samo jedno obavezno polje - ime koje ima niz tip.

Pogledajmo složeniji primjer definiranja protokola. Recimo da podatke o osobi moramo pohraniti u protobuf format:

paket protobuf;

paket protobuf; opcija java_package = "com.baeldung.protobuf"; opcija java_outer_classname = "AddressBookProtos"; poruka Osoba {obavezno ime niza = 1; potreban int32 id = 2; izborni string e-pošte = 3; ponovljeni brojevi nizova = 4; } adresar poruka {ponovljena osoba osoba = 1; }

Naš se protokol sastoji od dvije vrste podataka: a Osoba i an Adresar. Nakon generiranja koda (o tome više u kasnijem odjeljku), te će klase biti unutarnje klase unutar AddressBookProtos razred.

Kada želimo definirati potrebno polje - što znači da će stvaranje objekta bez takvog polja uzrokovati Iznimka, trebamo koristiti a potreban ključna riječ.

Stvaranje polja s neobavezna Ključna riječ znači da ovo polje ne treba postavljati. The ponovio ključna riječ vrsta je vrste promjenjive veličine.

Sva su polja indeksirana - polje označeno brojem 1 spremit će se kao prvo polje u binarnoj datoteci. Polje označeno s 2 spremit će se sljedeće i tako dalje. To nam daje bolju kontrolu nad rasporedom polja u memoriji.

4. Generiranje Java koda iz datoteke Protobuf

Jednom kada definiramo datoteku, iz nje možemo generirati kôd.

Prvo, moramo instalirati protobuf na naš stroj. Jednom kada to učinimo, možemo generirati kôd izvršavanjem a protoc naredba:

protoc -I =. --java_out =. adresar.proto

The protoc naredba će generirati izlaznu datoteku Java iz našeg adresar.proto datoteka. The -Ja opcija navodi direktorij u kojem a proto datoteka se nalazi. The java-out određuje direktorij u kojem će se stvoriti generirana klasa.

Generirana klasa imat će postavljače, getere, konstruktore i graditelje za naše definirane poruke. Također će imati neke korisne metode za spremanje protobuf datoteka i njihovo deserializiranje iz binarnog formata u Java klasu.

5. Stvaranje instance poruka definiranih protobufom

Generirani kod lako možemo koristiti za stvaranje Java instance a Osoba razred:

Niz e-pošte = "[e-pošta zaštićena]"; int id = novo Random (). nextInt (); Naziv niza = "Michael program"; Niz niza = "01234567890"; AddressBookProtos.Person person = AddressBookProtos.Person.newBuilder () .setId (id) .setName (name) .setEmail (email) .addNumbers (number) .build (); assertEquals (person.getEmail (), email); assertEquals (person.getId (), id); assertEquals (person.getName (), name); assertEquals (person.getNumbers (0), broj);

Tečni graditelj možemo stvoriti pomoću a newBuilder () metodu na željenoj vrsti poruke. Nakon postavljanja svih potrebnih polja, možemo nazvati a izgraditi() metoda za stvaranje instance a Osoba razred.

6. Serijalizacija i deserijalizacija protobufa

Jednom kada stvorimo instancu našeg Osoba klase, želimo to spremiti na disk u binarnom formatu koji je kompatibilan sa stvorenim protokolom. Recimo da želimo stvoriti instancu Adresar razreda i dodajte jednu osobu u taj objekt.

Dalje, tu datoteku želimo spremiti na disk - postoji writeTo () util metoda u automatski generiranom kodu koji možemo koristiti:

AddressBookProtos.AddressBook addressBook = AddressBookProtos.AddressBook.newBuilder (). AddPeople (person) .build (); FileOutputStream fos = novi FileOutputStream (filePath); addressBook.writeTo (fos);

Nakon izvršavanja te metode, naš će se objekt serializirati u binarni format i spremiti na disk. Da biste učitali te podatke s diska i deserijalizirali ih natrag na Adresar objekt koji možemo koristiti a mergeFrom () metoda:

AddressBookProtos.AddressBook deserialized = AddressBookProtos.AddressBook.newBuilder () .mergeFrom (novi FileInputStream (filePath)). Build (); assertEquals (deserialized.getPeople (0) .getEmail (), email); assertEquals (deserialized.getPeople (0) .getId (), id); assertEquals (deserialized.getPeople (0) .getName (), name); assertEquals (deserialized.getPeople (0) .getNumbers (0), number);

7. Zaključak

U ovom smo kratkom članku uveli standard za opis i pohranu podataka u binarnom formatu - Google Protocol Buffer.

Stvorili smo jednostavan protokol, kreirali Java primjerak koji je u skladu s definiranim protokolom. Dalje, vidjeli smo kako serializirati i deserializirati objekte pomoću protobufa.

Provedbu svih ovih primjera i isječaka koda možete pronaći u projektu GitHub - ovo je Maven projekt, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.


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