Является ли определение внешнего термина Erlang стабильным? Если нет, что использовать?

Формат внешнего выражения Erlang изменился хотя бы один раз (но это изменение предшествует истории, хранящейся в файле glub Erlang/OTP хранилище); очевидно, это может измениться в будущем.

Однако, как практический вопрос, обычно считается безопасным предположить, что этот формат является стабильным сейчас? Под "стабильным" я подразумеваю, что для любого термина T term_to_binary будет возвращать тот же двоичный файл в любой текущей или будущей версии Erlang (а не только в том, вернет ли он двоичный код, который binary_to_term преобразует обратно в член, идентичный T). Мне интересно это свойство, потому что я хотел бы хранить хэши произвольных членов Erlang на диске, и я хочу, чтобы идентичные термины имели одно и то же значение хеша теперь и в будущем.

Если небезопасно предполагать, что формат термина является стабильным, что люди используют для эффективной и стабильной сериализации термина?

Ответ 1

было заявлено, что erlang обеспечит совместимость как минимум для двух основных выпусков. это означало бы, что файлы BEAM, протокол распространения, формат внешнего термина и т.д. из R14 будут по меньшей мере работать до R16.

"У нас есть стратегия по крайней мере поддерживать обратную совместимость 2 основных выпусков во времени" .

В общем, мы только отменяем обратную совместимость в основных выпусках и только по очень веской причине и обычно после первого обесценивания функция один или два релиза заранее.

Ответ 2

erlang: phash2 гарантированно является стабильным хэшем члена Эрланга.

Я не думаю, что OTP делает гарантию, что term_to_binary(T) в vX =: = term_to_binary(T) в vY. Многое может измениться, если они вводят новые термины для оптимизированных представлений о вещах. Или если нам нужно добавить строки Юникода в ETF или что-то еще. Или в исчезающем маловероятном будущем, в котором мы вводим новый фундаментальный тип данных. Пример изменения, который произошел только во внешнем представлении (хранимые выражения сравниваются равными, но не равны байтам) см. float_ext vs. new_float_ext.

В практическом плане, если вы придерживаетесь атомов, списков, кортежей, целых чисел, поплавков и двоичных файлов, то вы наверняка будете в безопасности с term_to_binary в течение некоторого времени. Если придет время, когда их представление ETF изменится, вы всегда можете написать собственную версию term_to_binary, которая не изменяется с помощью ETF.

Ответ 3

Для сериализации данных я обычно выбираю между буферами протокола Google и JSON. Оба они очень стабильны. Для работы с этими форматами из Erlang я использую Piqi, Erlson и mochijson2.

Большое преимущество Protobuf и JSON заключается в том, что они могут использоваться с других языков программирования по дизайну, тогда как формат внешнего термина Erlang более или менее специфичен для Erlang.

Обратите внимание, что строковое представление JSON зависит от реализации (экранированные символы, точность с плавающей запятой, пробелы и т.д.), и по этой причине он может быть непригоден для вашего прецедента.

Protobuf менее прост для работы по сравнению с форматами форматов, но это очень продуманный и мощный инструмент.

Вот несколько других схемных двоичных форматов сериализации, которые нужно учитывать. Я не знаю, насколько они стабильны. Может оказаться, что формат внешнего термина Эрланг более стабилен.