繁体   English   中英

为什么在反序列化 Elixir 映射时`erl_decode` 会返回 NULL?

[英]Why does `erl_decode` return NULL when deserializing an Elixir map?

我正在尝试在 Elixir 程序和 C 程序之间移动一些数据。 在 Elixir 中,我有一个我想要移动的结构。 我使用:erlang.term_to_binary将其转换为二进制文件,然后我将其混搭为 C。

但是,当我解码它时,它只返回NULL ?? 并且没有错误消息或任何东西。 一堆其他长生不老药/erlang 术语工作正常; 当我尝试通过地图或结构(这是一种地图)发送时,它特别失败。

我在 Elixir 中做这样的事情:

  msg = %Message{ title: "hello", body: "world" }
  binmsg = :erlang.term_to_binary(msg)
  send(state.port, {self(), {:command, binmsg}})

.. 和 C (不包括接收消息,我已经确认已经以正确的长度到达,甚至确认 C 和 elixir 中的字节是相同的):

  uint8_t *buf = read_cmd();
  ETERM *map = erl_decode(buf);
  erl_print_term(map, stdout);

从 erl_decode 的源代码看来,它不支持反序列化映射。 从 Erlang/OTP 17 开始,映射在 Erlang 的二进制协议中定义,但在erl_marshal.c没有提及erl_marshal.c

这很可能是因为erl_marshal是非常传统的,并且自 Erlang/OTP 22 起已被弃用。请改用ei_decode_*系列函数! 甚至还有一个ei_decode_map_header 那应该工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM