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.