サンプルプログラム全容
Java向けソースコードに特化した内容ではあったが、Protocol Bufferについて一通り説明させていただいた。いかがだったであろうか。
最後に、今回使用したサンプル(修正後)を全て掲載する。読者の皆さんが、Protocol Bufferを理解するための一助になれば幸いである。
リスト: Persons2.proto(修正後のprotoファイル)
package mycom.journal;
option java_package = "jp.co.mycom.journal";
option java_outer_classname = "Persons";
option optimize_for = SPEED;
message Person {
message Name {
required string first_name = 1;
required string last_name = 2;
optional string middle_name = 3;
}
// 名前を表す。必須
required Name name = 1;
// 年齢を表す
optional int32 age = 2;
enum Gender {
MALE = 0;
FEMALE = 1;
}
optional Gender gender = 3 [default = MALE];
extensions 1000 to max;
}
// Person型を拡張し、「体重」フィールドを加える
extend Person {
optional int32 weight = 1000;
}
// RPCの戻り値として使用されるレスポンス
message HelloResponse {
required string message = 1;
}
// RPCサービスの定義
service HelloService {
rpc hello(Person) returns (HelloResponse);
}
リスト: ReadWritePerson2.java(拡張フィールドの読み書きに対応したサンプルプログラム)
import jp.co.mycom.journal.Persons;
import java.io.*;
import com.google.protobuf.ExtensionRegistry;
public class ReadWritePerson2 {
private static final String FILE_NAME = "person.data";
public static void main(String[] args) throws Exception {
// ファイルへの書き出し
Persons.Person.Builder shiraishiBuilder = Persons.Person.newBuilder();
Persons.Person.Name shiraishiName = Persons.Person.Name.newBuilder()
.setFirstName("白石")
.setLastName("俊平")
.build();
Persons.Person shiraishi = shiraishiBuilder
.setName(shiraishiName)
.setAge(30)
.setGender(Persons.Person.Gender.MALE)
.setExtension(Persons.weight, 65)
.build();
OutputStream out = new FileOutputStream(FILE_NAME);
shiraishi.writeTo(out);
out.close();
// ファイルからの読み込み
InputStream in = new FileInputStream(FILE_NAME);
ExtensionRegistry registry = ExtensionRegistry.newInstance();
registry.add(Persons.weight);
shiraishi = Persons.Person.parseFrom(in, registry);
in.close();
System.out.printf("名前:%s 年齢:%d 性別:%s 体重:%d%n",
shiraishi.getName(), shiraishi.getAge(),
shiraishi.getGender(),
shiraishi.getExtension(Persons.weight));
}
}