Ответ 1
было заявлено, что erlang обеспечит совместимость как минимум для двух основных выпусков. это означало бы, что файлы BEAM, протокол распространения, формат внешнего термина и т.д. из R14 будут по меньшей мере работать до R16.
Формат внешнего выражения Erlang изменился хотя бы один раз (но это изменение предшествует истории, хранящейся в файле glub Erlang/OTP хранилище); очевидно, это может измениться в будущем.
Однако, как практический вопрос, обычно считается безопасным предположить, что этот формат является стабильным сейчас? Под "стабильным" я подразумеваю, что для любого термина T
term_to_binary
будет возвращать тот же двоичный файл в любой текущей или будущей версии Erlang (а не только в том, вернет ли он двоичный код, который binary_to_term
преобразует обратно в член, идентичный T
). Мне интересно это свойство, потому что я хотел бы хранить хэши произвольных членов Erlang на диске, и я хочу, чтобы идентичные термины имели одно и то же значение хеша теперь и в будущем.
Если небезопасно предполагать, что формат термина является стабильным, что люди используют для эффективной и стабильной сериализации термина?
было заявлено, что erlang обеспечит совместимость как минимум для двух основных выпусков. это означало бы, что файлы BEAM, протокол распространения, формат внешнего термина и т.д. из R14 будут по меньшей мере работать до R16.
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.
Для сериализации данных я обычно выбираю между буферами протокола Google и JSON. Оба они очень стабильны. Для работы с этими форматами из Erlang я использую Piqi, Erlson и mochijson2.
Большое преимущество Protobuf и JSON заключается в том, что они могут использоваться с других языков программирования по дизайну, тогда как формат внешнего термина Erlang более или менее специфичен для Erlang.
Обратите внимание, что строковое представление JSON зависит от реализации (экранированные символы, точность с плавающей запятой, пробелы и т.д.), и по этой причине он может быть непригоден для вашего прецедента.
Protobuf менее прост для работы по сравнению с форматами форматов, но это очень продуманный и мощный инструмент.
Вот несколько других схемных двоичных форматов сериализации, которые нужно учитывать. Я не знаю, насколько они стабильны. Может оказаться, что формат внешнего термина Эрланг более стабилен.