Pengenalan kepada Buffer Protokol Google

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat Buffer Protokol Google (protobuf) - format data binari agnostik yang terkenal. Kita dapat menentukan file dengan protokol dan selanjutnya, dengan menggunakan protokol itu, kita dapat menghasilkan kod dalam bahasa seperti Java, C ++, C #, Go, atau Python.

Ini adalah artikel pengantar format itu sendiri; jika anda ingin melihat cara menggunakan format dengan aplikasi web Spring, lihat artikel ini.

2. Mendefinisikan Pergantungan Maven

Untuk menggunakan buffer protokol adalah Java, kita perlu menambahkan ketergantungan Maven ke protobuf-java:

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

3. Menentukan Protokol

Mari kita mulakan dengan contoh. Kita boleh menentukan protokol yang sangat mudah dalam format protobuf:

message Person { required string name = 1; }

Ini adalah protokol dari pesanan ringkas jenis Orang yang hanya mempunyai satu bidang yang diperlukan - nama yang mempunyai jenis rentetan .

Mari kita lihat contoh yang lebih kompleks dalam menentukan protokol. Katakan bahawa kita perlu menyimpan butiran orang dalam format protobuf:

protobuf pakej;

package protobuf; option java_package = "com.baeldung.protobuf"; option java_outer_classname = "AddressBookProtos"; message Person { required string name = 1; required int32 id = 2; optional string email = 3; repeated string numbers = 4; } message AddressBook { repeated Person people = 1; }

Protokol kami terdiri daripada dua jenis data: Orang dan Buku Alamat. Setelah menghasilkan kod (lebih lanjut mengenai ini di bahagian kemudian), kelas tersebut akan menjadi kelas dalaman di dalam kelas AddressBookProtos .

Apabila kita ingin menentukan bidang yang diperlukan - yang bermaksud bahawa membuat objek tanpa bidang tersebut akan menyebabkan Pengecualian , kita perlu menggunakan kata kunci yang diperlukan .

Membuat medan dengan kata kunci pilihan bermaksud medan ini tidak perlu ditetapkan. Kata kunci berulang adalah jenis array dengan ukuran berubah.

Semua medan diindeks - medan yang dilambangkan dengan nombor 1 akan disimpan sebagai medan pertama dalam fail binari. Medan bertanda 2 akan disimpan seterusnya dan seterusnya. Itu memberi kita kawalan yang lebih baik mengenai bagaimana bidang dibentangkan dalam memori.

4. Menghasilkan Kod Java Dari Fail Protobuf

Sebaik sahaja kita menentukan fail, kita dapat menghasilkan kod darinya.

Pertama, kita perlu memasang protobuf pada mesin kita. Setelah kami melakukan ini, kami dapat menghasilkan kod dengan melaksanakan perintah protokol :

protoc -I=. --java_out=. addressbook.proto

The protoc arahan akan menjana fail output Java dari kami addressbook.proto fail . Pilihan -I menentukan direktori di mana fail proto berada. The java keluar menentukan direktori di mana kelas yang dijana akan diwujudkan.

Kelas yang dihasilkan akan mempunyai setter, getter, konstruktor dan pembangun untuk mesej yang ditentukan kami. Ia juga akan mempunyai beberapa kaedah penggunaan untuk menyimpan fail protobuf dan mendeseralisasikannya dari format binari ke kelas Java.

5. Membuat Contoh Mesej yang Ditentukan oleh Protobuf

Kita dapat dengan mudah menggunakan kod yang dihasilkan untuk membuat contoh Java dari kelas Person :

String email = "[email protected]"; int id = new Random().nextInt(); String name = "Michael Program"; String number = "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), number);

Kita boleh membuat pembangun lancar dengan menggunakan kaedah newBuilder () pada jenis mesej yang diinginkan. Setelah menyiapkan semua bidang yang diperlukan, kita dapat memanggil kaedah build () untuk membuat instance kelas Person .

6. Melancarkan Serialisasi dan Mendeserialisasi Protobuf

Sebaik sahaja kami membuat contoh kelas Person kami , kami ingin menyimpannya pada cakera dalam format binari yang serasi dengan protokol yang dibuat. Katakan bahawa kita mahu membuat contoh kelas AddressBook dan menambahkan satu orang ke objek tersebut.

Seterusnya, kami ingin menyimpan fail tersebut pada cakera - ada kaedah penggunaan writeTo () dalam kod yang dihasilkan secara automatik yang dapat kami gunakan:

AddressBookProtos.AddressBook addressBook = AddressBookProtos.AddressBook.newBuilder().addPeople(person).build(); FileOutputStream fos = new FileOutputStream(filePath); addressBook.writeTo(fos);

Setelah melaksanakan kaedah tersebut, objek kami akan diselaraskan ke format binari dan disimpan pada cakera. Untuk memuatkan data dari cakera dan mendeseralisasikannya kembali ke objek Buku Alamat, kita dapat menggunakan kaedah mergeFrom () :

AddressBookProtos.AddressBook deserialized = AddressBookProtos.AddressBook.newBuilder() .mergeFrom(new 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. Kesimpulannya

Dalam artikel ringkas ini, kami memperkenalkan standard untuk menerangkan dan menyimpan data dalam format binari - Google Protocol Buffer.

Kami membuat protokol sederhana, membuat instance Java yang sesuai dengan protokol yang ditentukan. Seterusnya, kami melihat bagaimana untuk membuat siri dan menyah deserialisasi objek menggunakan protobuf.

Pelaksanaan semua contoh dan coretan kod ini terdapat dalam projek GitHub - ini adalah projek Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.