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