Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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 менее прост для работы по сравнению с форматами форматов, но это очень продуманный и мощный инструмент.

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