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;
}

我可以对用户进行编码:

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

并解码用户:

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 回答