问题 Erlang的外部术语格式定义是否稳定?如果没有,该怎么用?


Erlang外部术语格式 至少改变了一次 (但此更改似乎早于存储在Erlang / OTP github存储库中的历史记录);显然,它 可以 改变未来。

但是,作为一个实际问题,通常认为这种格式现在稳定是安全的吗? “稳定”,我的意思是,任何一个术语 Tterm_to_binary 将在任何当前或未来版本的Erlang中返回相同的二进制文件(不仅仅是它是否会返回二进制文件) binary_to_term 将转换回与...相同的术语 T)。我对这个属性感兴趣,因为我想在磁盘上存储任意Erlang术语的哈希值,并且我希望相同的术语现在和将来都具有相同的哈希值。

如果假设术语格式稳定是不安全的,那么人们使用什么来进行有效和稳定的术语序列化?


2408
2017-11-27 05:13


起源



答案:


据说erlang将为至少2个主要版本提供兼容性。这意味着来自R14的BEAM文件,分发协议,外部术语格式等至少可以达到R16。

“我们的策略是至少支持向后兼容2个主要版本。”

“一般来说,我们只会破坏主要版本的向后兼容性   并且只是出于很好的理由而且通常在首次弃用之后   事先发布一两个特征。“


7
2017-11-27 06:06



尽管这些陈述留下了外部术语格式在主要版本(可能仅在紧急情况下)或以兼容但不一定相同的方式发生变化的可能性,但该政策非常令人鼓舞。谢谢! - willb


答案:


据说erlang将为至少2个主要版本提供兼容性。这意味着来自R14的BEAM文件,分发协议,外部术语格式等至少可以达到R16。

“我们的策略是至少支持向后兼容2个主要版本。”

“一般来说,我们只会破坏主要版本的向后兼容性   并且只是出于很好的理由而且通常在首次弃用之后   事先发布一两个特征。“


7
2017-11-27 06:06



尽管这些陈述留下了外部术语格式在主要版本(可能仅在紧急情况下)或以兼容但不一定相同的方式发生变化的可能性,但该政策非常令人鼓舞。谢谢! - willb


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没有变化。


2
2017-12-05 19:36





对于数据序列化,我通常在Google Protocol Buffers和JSON之间进行选择。它们都非常稳定。为了使用Erlang中的这些格式,我使用 PiqiErlson 和 mochijson2

Protobuf和JSON的巨大优势在于它们可以通过设计从其他编程语言中使用,而Erlang外部术语格式或多或少地特定于Erlang。

请注意,JSON字符串表示是依赖于实现的(转义字符,浮点精度,空格等),因此它可能不适合您的用例。

与无模式格式相比,Protobuf不太容易使用,但它是一个设计精良且功能强大的工具。

以下是一些需要考虑的其他无模式二进制序列化格式。我不知道他们有多稳定。可能会发现Erlang外部术语格式更稳定。


1
2017-11-27 08:23