nev*_*vyn 2 erlang serialization elixir
我正在尝试在 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}})
Run Code Online (Sandbox Code Playgroud)
.. 和 C(不包括接收消息,我已经确认它已经以正确的长度到达,甚至确认 C 和 elixir 中的字节是相同的):
uint8_t *buf = read_cmd();
ETERM *map = erl_decode(buf);
erl_print_term(map, stdout);
Run Code Online (Sandbox Code Playgroud)
这似乎从erl_decode的源代码,它不支持反序列化映射。从 Erlang/OTP 17 开始,映射在 Erlang 的二进制协议中定义,但里面没有提到 MAP_EXT erl_marshal.c
。
这可能是因为erl_marshal
是 hella 遗留问题,并且自 Erlang/OTP 22 以来已被弃用。请改用ei_decode_*
函数系列!甚至还有一个ei_decode_map_header
。那应该工作。
归档时间: |
|
查看次数: |
43 次 |
最近记录: |