Стабильно ли определение формата внешнего термина Эрланга?Если нет, что использовать? - PullRequest
11 голосов
/ 27 ноября 2011

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

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

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

Ответы [ 3 ]

8 голосов
/ 27 ноября 2011

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

«У нас есть стратегия, по крайней мере, для обеспечения обратной совместимости двух основных выпусков в прошлое».

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

3 голосов
/ 05 декабря 2011

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.

1 голос
/ 27 ноября 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...