Ú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.