Search on the blog

2016年8月9日火曜日

Protocol Buffersを使ってみた

JavaでGoogleのProtocol Buffersを使ってみました。

インストール
以下の公式ページからコンパイラをダウンロード。
https://developers.google.com/protocol-buffers/docs/downloads

READMEに従ってビルド。
$ ./configure
$ make
$ make check
$ make install

IDLからJavaソースを自動生成
作業フォルダに移動して、gradleでプロジェクトを作成する。
gradle init --type java-library

protoファイルを書かないといけないらしいので書く。protoファイルは、いわゆるIDL(インターフェース記述言語)の一種。
$ cat protos/sample.proto 
package sample;

option java_package = "com.kenjih.sample";
option java_outer_classname = "SampleProtos";

message Person {
  required string name = 1;
  required int32 age = 2;
  required string sex = 3;
}

コンパイルして、IDLからjavaファイルを生成する。
$ protoc --java_out=src/main/java protos/sample.proto

なんか出来た。
$ find . -name "*.java"
./src/main/java/com/kenjih/sample/SampleProtos.java

ビルドする。
build.gradleに以下を追記。
apply plugin: 'application'
mainClassName = 'com.kenjih.sample.Main'
dependencies {
    compile group: 'com.google.protobuf', name: 'protobuf-java', version: '3.0.0'
}

./gradlew buildでコンパイル。
BUILD SUCCESSFULとでればOK。

動作確認
動作確認用のコードを書いてみる。
package com.kenjih.sample;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import com.kenjih.sample.SampleProtos.Person;

public class Main {
  public static void main(String[] args) throws IOException {
    Person.Builder builder = Person.newBuilder();
    Person p = builder.setName("Taro").setAge(20).setSex("Male").build();
    p.writeTo(new FileOutputStream("person.bin"));

    Person q = Person.parseFrom(new FileInputStream("person.bin"));
    System.out.println(q.toString());
  }
}

gradleから実行。
$ ./gradlew run
name: "Taro"
age: 20
sex: "Male"

serialize/deserializeが出来ていることを確認できた。
ついでにバイナリファイルの中身を確認してみる。
$ hexdump -C person.bin
00000000  0a 04 54 61 72 6f 10 14  1a 04 4d 61 6c 65        |..Taro....Male|
0000000e
なるほど。

0 件のコメント:

コメントを投稿