2013-08-19 19 views
0

我使用basho's erlang protocol buffer如何在Erlang中對Google的協議緩衝區擴展進行編碼/解碼?

有一個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()) 

然後我編碼信息:

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

什麼錯了?我以爲我是用錯誤的方式編碼的,請幫助我!

回答

1

當我跳入由protobuffs_compile:generate/1生成的usr_pb.erl後,我認爲它是protobuffs庫中的一個錯誤。

如果擴展定義嵌套(即擴展是在消息定義中定義的),它不會爲擴展生成正確的函數。現在,如果我重寫這樣的原始文件:

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