term_to_binary的字符串版本

时间:2010-10-21 16:56:35

标签: serialization tcp erlang messages custom-protocol

我正在尝试编写一个通过tcp与客户端通信的简单服务器。我有它发送消息很好,但现在我希望它将消息解释为Erlang数据类型。例如,假装它类似于HTTP(它不是)并且我想从客户端{get, "/foo.html"}发送并让服务器将其解释为包含原子和列表的元组,而不仅仅是一个大列表或二进制文件

我可能会最终使用term_to_binarybinary_to_term,但调试基于文本的协议要容易得多,我希望找到一个更易于列表的版本。有人藏在某个地方吗?

1 个答案:

答案 0 :(得分:4)

您可以通过以下方式将字符串解析为表达式(类似于file:consult):

% InputString = "...",
{ok, Scanned, _} = erl_scan:string(InputString),
{ok, Exprs} = erl_parse:parse_exprs(Scanned),
{value, ParsedValue, _} = erl_eval:exprs(Exprs, [])

(见http://www.trapexit.org/String_Eval

您应该能够使用io_lib:format使用~w~p格式代码将表达式转换为字符串,例如io_lib:format("~w", [{get, "/foo.html"}])

我认为这不会很快,所以如果性能是一个问题,你可能不应该使用这样的字符串。

另请注意,由于您正在评估任意表达式,因此这可能不安全 - 如果您采用此路线,则应该对中间输出进行一些检查。我建议查看erl_parse:parse_exprs的结果,以确保它包含您感兴趣的格式(即,它始终是{atom(),list()}的元组,没有嵌入的函数调用。你应该可以通过模式匹配来做到这一点。