我正在使用basho's erlang protocol buffer
有一个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,所以我创建了一个字典:
Extensions = dict:append(1000, UsrMsg, dict:new())
然后我编码Msg:
MsgBin = usr_pb:encode_msg(#msg{id = 1, '$extensions' = Extensions})
并解码Msg:
MsgMsg = usr_pb:decode_msg(list_to_binary(MsgBin))
但是,我无法获得扩展名:
msg_pb:get_extension(MsgMsg, 1000)(this returned "undefined")
出了什么问题?我以为我是以错误的方式编码,请帮我解决!
答案 0 :(得分: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),