Serialization 术语\u到\u二进制的字符串版本

Serialization 术语\u到\u二进制的字符串版本,serialization,tcp,erlang,messages,custom-protocol,Serialization,Tcp,Erlang,Messages,Custom Protocol,我正在尝试编写一个简单的服务器,通过tcp与客户机对话。我让它发送消息,但现在我希望它将消息解释为Erlang数据类型。例如,假设它是类似HTTP的(不是),我想从客户机{get,“/foo.html”}发送它,让服务器将其解释为一个包含原子和列表的元组,而不仅仅是一个大列表或二进制文件 我可能最终会使用term_to_binary和binary_to_term,但是调试基于文本的协议要容易得多,所以我希望找到一个更易于列表的版本。是否有一个隐藏在某处?您可以通过以下方式将字符串解析为表达式(类

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


我可能最终会使用
term_to_binary
binary_to_term
,但是调试基于文本的协议要容易得多,所以我希望找到一个更易于列表的版本。是否有一个隐藏在某处?

您可以通过以下方式将字符串解析为表达式(类似于
文件:查阅
):

(见附件)

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

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


还要注意,这可能是不安全的,因为您正在计算任意表达式——如果您这样做,您可能应该对中间输出进行一些检查。我建议查看
erl_parse:parse_exprs
的结果,以确保它包含您感兴趣的格式(即,它始终是{atom(),list()}的元组,没有嵌入函数调用。您应该可以通过模式匹配来实现这一点。

这正是我要寻找的。这是为了调试和开发,所以性能几乎不是问题。谢谢
% InputString = "...",
{ok, Scanned, _} = erl_scan:string(InputString),
{ok, Exprs} = erl_parse:parse_exprs(Scanned),
{value, ParsedValue, _} = erl_eval:exprs(Exprs, [])