Úvod do vyrovnávacej pamäte protokolu Google

1. Prehľad

V tomto článku sa pozrieme na Google Protocol Buffer (protobuf) - známy jazykovo-agnostický formát binárnych údajov. Môžeme definovať súbor s protokolom a pomocou tohto protokolu môžeme vygenerovať kód v jazykoch ako Java, C ++, C #, Go alebo Python.

Toto je úvodný článok k samotnému formátu; Ak sa chcete dozvedieť, ako používať formát s webovou aplikáciou Spring, pozrite si tento článok.

2. Definovanie závislostí Maven

Ak chcete používať vyrovnávaciu pamäť protokolu, je Java, musíme pridať závislosť Maven do protokolu protobuf-java:

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

3. Definovanie protokolu

Začnime príkladom. Môžeme definovať veľmi jednoduchý protokol v protobufovom formáte:

správa Osoba {povinný názov reťazca = 1; }

Toto je protokol jednoduchej správy z Osoba typ, ktorý má iba jedno povinné pole - názov, ktorý má a povrázok typu.

Pozrime sa na zložitejší príklad definovania protokolu. Povedzme, že musíme uložiť údaje o osobe vo formáte protobuf:

balíček protobuf;

balíček protobuf; možnosť java_package = "com.baeldung.protobuf"; option java_outer_classname = "AddressBookProtos"; správa Osoba {povinný názov reťazca = 1; požadované int32 id = 2; voliteľný reťazec email = 3; opakované čísla reťazcov = 4; } správa Adresár {opakovaná osoba ľudia = 1; }

Náš protokol sa skladá z dvoch typov údajov: a Osoba a an Adresár. Po vygenerovaní kódu (viac v tejto časti v ďalšej časti) budú tieto triedy vnútornými triedami vo vnútri AddressBookProtos trieda.

Keď chceme definovať požadované pole - to znamená, že vytvorenie objektu bez takého poľa spôsobí Výnimka, musíme použiť a požadovaný kľúčové slovo.

Vytvorenie poľa pomocou voliteľné kľúčové slovo znamená, že toto pole nie je potrebné nastavovať. The opakoval kľúčové slovo je typ poľa s premenlivou veľkosťou.

Všetky polia sú indexované - pole označené číslom 1 sa uloží ako prvé pole v binárnom súbore. Pole označené 2 sa uloží ďalej a podobne. To nám dáva lepšiu kontrolu nad tým, ako sú polia rozložené v pamäti.

4. Generovanie kódu Java zo súboru Protobuf

Keď definujeme súbor, môžeme z neho vygenerovať kód.

Najskôr musíme na náš stroj nainštalovať protobuf. Keď to urobíme, môžeme vygenerovať kód vykonaním a protoc príkaz:

protoc -I =. --java_out =. adresár.proto

The protoc príkaz vygeneruje výstupný súbor Java z nášho adresár.proto spis. The -Ja voľba určuje adresár, v ktorom a proto súbor sa nachádza. The java-out určuje adresár, kde sa vygenerovaná trieda vytvorí.

Vygenerovaná trieda bude mať nastavovače, getre, konštruktory a stavače pre naše definované správy. Bude mať tiež niektoré metódy využívania na ukladanie súborov protobuf a ich deserializáciu z binárneho formátu do triedy Java.

5. Vytvorenie inštancie správ definovaných protokolom Protobuf

Generovaný kód môžeme ľahko použiť na vytvorenie inštancie jazyka Java a Osoba trieda:

Reťazec email = "[e-mail chránený]"; int id = new Random (). nextInt (); Názov reťazca = "Michalský program"; Číslo reťazca = "01234567890"; AddressBookProtos.Person person = AddressBookProtos.Person.newBuilder () .setId (id) .setName (meno) .setEmail (e-mail) .addNumbers (číslo) .build (); assertEquals (person.getEmail (), e-mail); assertEquals (person.getId (), id); assertEquals (person.getName (), meno); assertEquals (person.getNumbers (0), number);

Môžeme vytvoriť plynulého tvorcu pomocou a newBuilder () požadovaného typu správy. Po nastavení všetkých povinných polí môžeme zavolať a build () metóda na vytvorenie inštancie a Osoba trieda.

6. Serializácia a deserializácia protokolu Protobuf

Akonáhle vytvoríme inštanciu nášho Osoba triedy, chceme to uložiť na disk v binárnom formáte, ktorý je kompatibilný s vytvoreným protokolom. Povedzme, že chceme vytvoriť inštanciu súboru Adresár triedy a pridať k tomuto objektu jednu osobu.

Ďalej chceme tento súbor uložiť na disk - existuje Písať() metóda util v automaticky generovanom kóde, ktorú môžeme použiť:

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

Po vykonaní tejto metódy bude náš objekt serializovaný do binárneho formátu a uložený na disk. Ak chcete načítať tieto údaje z disku a deserializovať ich späť na disk Adresár objekt môžeme použiť a mergeFrom () metóda:

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

7. Záver

V tomto rýchlom článku sme predstavili štandard pre popis a ukladanie údajov v binárnom formáte - Google Protocol Buffer.

Vytvorili sme jednoduchý protokol, inštanciu Java, ktorá je v súlade s definovaným protokolom. Ďalej sme videli, ako serializovať a deserializovať objekty pomocou protobuf.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete v projekte GitHub - jedná sa o projekt Maven, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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