【ハウツー】

XMLはもう不要!? Google製シリアライズツール「Protocol Buffer」

9 サンプルプログラム全容

    白石俊平  [2008/07/18]

    サンプルプログラム全容

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

    関連記事

    関連サイト

    関連したタグ

    新着記事

    特設サイトの情報

      求人情報

      人気記事

      一覧

      イチオシ記事

      新着記事

      特別企画

      転職ノウハウ

      あなたの仕事適性診断

      4つの診断で、自分の適性を見つめなおそう!

      Heroes File ~挑戦者たち~

      働くこと・挑戦し続けることへの思いを綴ったインタビュー

      はじめての転職診断

      あなたにピッタリのアドバイスを読むことができます。

      転職Q&A

      転職に必要な情報が収集できます

      スカウト転職する

      企業からアプローチのメッセージが届きます。

      マイナビニュースマガジン