0

Basho の erlang プロトコル バッファを使用しています

usr.proto があります:

message Msg {
  required int32 id = 1;
  extensions 100 to max;
}
message Usr {
  extend Msg { optional Usr msg = 1000; }
  required int64 id = 1;
}

Usr をエンコードできます。

UsrBin = usr_pb:encode_usr(#usr{id = 1})

Usr をデコードします。

UsrMsg = usr_pb:decode_usr(list_to_binary(UsrBin))

問題は次のとおりです。Msg をエンコードしたいので、dict を作成します。

Extensions = dict:append(1000, UsrMsg, dict:new())

次に、メッセージをエンコードします。

MsgBin = usr_pb:encode_msg(#msg{id = 1, '$extensions' = Extensions})

メッセージをデコードします:

MsgMsg = usr_pb:decode_msg(list_to_binary(MsgBin))

ただし、拡張機能を取得できません。

msg_pb:get_extension(MsgMsg, 1000)(this returned "undefined")

何が問題だったのですか?間違った方法でコーディングしていると思いました。助けてください!

4

1 に答える 1

1

protobuffs_compile:generate/1 によって生成された usr_pb.erl に飛び込んだ後、protobuffs ライブラリのバグだと思いました。

拡張機能の定義がネストされている (つまり、拡張機能がメッセージ定義内で定義されている) 場合、拡張機能に対して適切な関数が生成されませんでした。proto ファイルを次のように書き換えると、次のようになります。

message Msg {
  required int32 id = 1;
  extensions 100 to max;
}

message Usr {
  required int64 id = 1;
}

extend Msg {
  optional Usr msg = 1000;
}

すべてうまくいく。

また、拡張機能に対応する API は明確です。

usr_pb:set_extension(#msg{id = 1, '$extensions' = dict:new()}, msg, UsrMsg)

{ok, Extension} = usr_pb:get_extension(MsgDecoded, msg),
于 2013-08-20T10:11:28.777 に答える