サンプルプログラム全容

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));
    }
}