LoginSignup
9
4

More than 3 years have passed since last update.

ProtocolBuffersでのwrappers.protoの使い方

Last updated at Posted at 2019-06-14

今回はProtocolBuffersを使用していてデフォルト値に関して苦しんだので、解決方法をシェアしたいと思います。

ProtocolBuffersのデフォルト値

前提としてProtocolBuffersにはデフォルト値が存在します。

文字列 空文字列
バイト列 空バイト列
ブーリアン型 false(偽)
数値型 ゼロ
列挙型(enum) 定義の最初の値(数値は0)

proto2まではoptionalを使用してデフォルト値を設定していたようですが、proto3からはデフォルトでoptionalが適用されているそうで、何もしなければデフォルト値が入ってしまうということです。

では、protoにデフォルト値を入れたくない場合はどうすればいいのか・・・?

調べたらwrappers.protoを使用する方法に辿り着きました!

wrappers.proto

使い方としては、

  • wrappers.protoをimport
  • 型をProtocolbufのwrappers.proto内で定義されているものにする
import "google/protobuf/wrappers.proto";

message  Detailparam {
  google.protobuf.StringValue name = 1; //名前
  google.protobuf.StringValue adress = 3; //住所
  google.protobuf.Int32Value sex = 3; //性別
}

int32,int64,string,boolなど以下で定義されているので使いたい型に指定してあげてください!

ちなみにgoogle.protobufはpackage名です。

その次はコンパイル!wrappers.protoでラッピングされていればok!

Rubyでの使い方

実装で使用する際には、wrappers.protoのmessageでnewしてあげればok!

User::V1::Detailparam.new(
        name: Google::Protobuf::StringValue.new(value: 'taro',
        adress: Google::Protobuf::StringValue.new(value: 'tokyo',
        sex: Google::Protobuf::Int32Value.new(value: 1)
}

nilをいれたいときは

User::V1::Detailparam.new(
        name: nil,
        adress: nil,
        sex: nil
)

にすればデフォルト値が入らず、ちゃんとnilが入ってくれます!

参考記事

Proto2 vs Proto3 - Qiita
protobuf typeに値が入っているか確認するにはgoogle/protobuf/wrappers.protoをつかうとよい - 平日インプット週末アウトプットぶろぐ
spring5-kotlin-application/task.proto at 970974cbc5c6116178a0088d4c651a9b9aeaf290 · soushin/spring5-kotlin-application · GitHub
protobuf/wrappers.proto at master · protocolbuffers/protobuf · GitHub

9
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4