Erlang外部术语格式has changed at least once(但此更改似乎早于存储在Erlang / OTP github存储库中的历史记录);显然,可以在未来发生变化。
然而,实际上,一般认为这种格式现在稳定是安全的吗?通过“稳定”,我的意思是,对于任何术语T
,term_to_binary
将在任何当前或未来版本的Erlang中返回相同的二进制文件(不仅仅是它是否将返回{{1}的二进制文件将转换回与binary_to_term
相同的术语。我对这个属性感兴趣,因为我想在磁盘上存储任意Erlang术语的哈希值,并且我希望现在和将来使用相同的术语来获得相同的哈希值。
如果假设术语格式稳定是不安全的,那么人们使用什么来进行有效和稳定的术语序列化?
答案 0 :(得分:8)
据说erlang将为至少2个主要版本提供兼容性。这意味着来自R14的BEAM文件,分发协议,外部术语格式等至少可以工作到R16。
"We have as a strategy to at least support backwards compatibility 2 major releases back in time."
答案 1 :(得分:3)
erlang:保证phash2是Erlang术语的稳定哈希值。
我不认为OTP在vY中提出term_to_binary(T)
in vX =:= term_to_binary(T)
的保证。如果他们为优化的事物表示引入新的术语代码,很多事情都可能发生变化。或者,如果我们需要将unicode字符串添加到ETF或其他东西。或者在我们引入新的基本数据类型的不太可能的未来。有关仅在外部表示中发生的更改示例(存储的术语比较相等,但不是字节相等),请参阅float_ext
与new_float_ext
。
实际上,如果你坚持使用原子,列表,元组,整数,浮点数和二进制数,那么term_to_binary
可能已经安全了很长一段时间。如果他们的ETF表示发生变化的时候到了,那么您总是可以编写自己的term_to_binary
版本,并且不会随着ETF的变化而变化。
答案 2 :(得分:1)
对于数据序列化,我通常在Google Protocol Buffers和JSON之间进行选择。它们都非常稳定。要使用Erlang中的这些格式,我使用Piqi,Erlson和mochijson2。
Protobuf和JSON的一大优势在于它们可以通过设计从其他编程语言中使用,而Erlang外部术语格式或多或少地特定于Erlang。
请注意,JSON字符串表示是依赖于实现的(转义字符,浮点精度,空格等),因此它可能不适合您的用例。
与无模式格式相比,Protobuf使用起来不那么简单,但它是一个设计精良且功能强大的工具。
以下是一些需要考虑的其他无模式二进制序列化格式。我不知道他们有多稳定。可能会发现Erlang外部术语格式更稳定。