Help us understand the problem. What is going on with this article?

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

k-o-u
エンジニア2年生です。Rails/Vue
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした