らんぼーのエンジニア日記

不定期にサクッと更新していきます

ProtocolBuffersでのwrappers.protoの使い方

今回は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など以下で定義されているので使いたい型に指定してあげてください!

https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/wrappers.proto

ちなみに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