如何编码/解码谷歌&x27;Erlang中的s协议缓冲区扩展?

如何编码/解码谷歌&x27;Erlang中的s协议缓冲区扩展?,erlang,protocol-buffers,Erlang,Protocol Buffers,我正在使用 有一个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:d

我正在使用

有一个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())
然后我对Msg进行编码:

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")

怎么了?我以为我编错了,请帮帮我

在我深入到protobuff_compile:generate/1生成的usr_pb.erl之后,我认为这是protobuff库中的一个bug

如果扩展定义是嵌套的(即扩展是在消息定义中定义的),则它没有为扩展生成正确的函数。现在,如果我像这样重写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),