serialization - term_to_binary 的字符串版本

标签 serialization tcp erlang message custom-protocol

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

我可能最终会使用 term_to_binarybinary_to_term,但是调试基于文本的协议(protocol)要容易得多,因此我希望找到一个更适合列表的版本。有人躲在某处吗?

最佳答案

您可以通过以下方式将字符串解析为表达式(类似于 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()} 的元组),没有嵌入函数调用。您应该能够通过模式匹配来做到这一点。

关于serialization - term_to_binary 的字符串版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3989961/

相关文章:

java - 在 Tomcat 9 上运行的多线程服务器

c++ - C++中的TCP重传超时检测

postgresql - Erlang 和 PostgreSQL

c# - 用于 C# 中结构的字节序列化的字节

java - Jackson 序列化和意外 token (END_OBJECT),预期为 FIELD_NAME : missing property 'name'

delphi - 某些 HTTP 请求上的奇怪 TCP 重置 (RST)

erlang - 主管启动多个子项作为原子操作

使用 makecert.exe 创建的证书的 ssl_upgrade_failure

java - 在 Java 中序列化自定义异常中的字段

C++ Cereal 反序列化问题与大尺寸 vector