Pengantar Google Protocol Buffer

1. Ikhtisar

Pada artikel ini, kita akan melihat Google Protocol Buffer (protobuf) - format data biner bahasa-agnostik yang terkenal. Kita bisa mendefinisikan file dengan protokol dan selanjutnya, menggunakan protokol itu, kita bisa menghasilkan kode 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 Dependensi Maven

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

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

3. Mendefinisikan Protokol

Mari kita mulai dengan sebuah contoh. Kami dapat mendefinisikan protokol yang sangat sederhana dalam format protobuf:

message Person { required string name = 1; }

Ini adalah protokol dari pesan sederhana tipe Person yang hanya memiliki satu field wajib - nama yang memiliki tipe string .

Mari kita lihat contoh yang lebih kompleks dalam mendefinisikan protokol. Katakanlah kita perlu menyimpan detail orang dalam format protobuf:

paket protobuf;

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 dari dua jenis data: Orang dan Buku Alamat. Setelah membuat kode (lebih lanjut tentang ini di bagian selanjutnya), kelas tersebut akan menjadi kelas dalam di dalam kelas AddressBookProtos .

Saat kita ingin mendefinisikan field yang dibutuhkan - artinya membuat objek tanpa field tersebut akan menyebabkan Exception , kita perlu menggunakan kata kunci yang diperlukan .

Membuat bidang dengan kata kunci opsional berarti bidang ini tidak perlu disetel. Kata kunci berulang adalah jenis larik dengan ukuran variabel.

Semua bidang diindeks - bidang yang dilambangkan dengan angka 1 akan disimpan sebagai bidang pertama dalam file biner. Field bertanda 2 akan disimpan selanjutnya dan seterusnya. Itu memberi kami kontrol yang lebih baik atas bagaimana bidang ditata dalam memori.

4. Menghasilkan Kode Java Dari File Protobuf

Setelah kami mendefinisikan file, kami dapat menghasilkan kode darinya.

Pertama, kita perlu menginstal protobuf di mesin kita. Setelah kami melakukan ini, kami dapat menghasilkan kode dengan menjalankan perintah protoc :

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

The protoc perintah akan menghasilkan file output Java dari kami addressbook.proto berkas . The -I pilihan menentukan sebuah direktori di mana proto berkas berada. The java-out menentukan direktori dimana kelas yang dihasilkan akan dibuat.

Kelas yang dihasilkan akan memiliki penyetel, pengambil, konstruktor, dan pembuat untuk pesan yang kami tentukan. Ini juga akan memiliki beberapa metode util untuk menyimpan file protobuf dan deserialisasinya dari format biner ke kelas Java.

5. Membuat Instance dari Pesan yang Ditetapkan Protobuf

Kita dapat dengan mudah menggunakan kode yang dihasilkan untuk membuat instance 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 bisa membuat pembangun fasih dengan menggunakan metode newBuilder () pada jenis pesan yang diinginkan. Setelah menyiapkan semua bidang yang diperlukan, kita dapat memanggil metode build () untuk membuat instance kelas Person .

6. Serialisasi dan Deserialisasi Protobuf

Setelah kami membuat instance dari kelas Person kami , kami ingin menyimpannya di disk dalam format biner yang kompatibel dengan protokol yang dibuat. Katakanlah kita ingin membuat sebuah instance dari kelas AddressBook dan menambahkan satu orang ke objek itu.

Selanjutnya, kami ingin menyimpan file itu ke disk - ada metode util writeTo () dalam kode yang dibuat secara otomatis yang dapat kami gunakan:

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

Setelah menjalankan metode itu, objek kami akan diserialkan ke format biner dan disimpan di disk. Untuk memuat data itu dari disk dan deserialisasinya kembali ke objek AddressBook, kita dapat menggunakan metode 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. Kesimpulan

Dalam artikel singkat ini, kami memperkenalkan standar untuk mendeskripsikan dan menyimpan data dalam format biner - Google Protocol Buffer.

Kami membuat protokol sederhana, membuat instance Java yang sesuai dengan protokol yang ditentukan. Selanjutnya, kami melihat cara membuat serial dan deserialisasi objek menggunakan protobuf.

Penerapan semua contoh dan cuplikan kode ini dapat ditemukan di proyek GitHub - ini adalah proyek Maven, jadi semestinya mudah untuk mengimpor dan menjalankannya apa adanya.