2012-02-21 2 views
6

Интересно, поддерживает ли какая-либо из высокопроизводительных библиотек сериализации (например, буферов протокола Google) sum types.Высокопроизводительная библиотека сериализации объектов, поддерживающая типы сумм

типа Sum помечается союзами, в основном возможности сказать что-то либо A, тип B или C. Sum используется в таких языках, как Haskell и ML, которые поддерживают Algebraic Data Types

ответ

2

Если под «как протокол Google буферов "вы имеете в виду способность генерировать код для нескольких языков, тогда, вероятно, такой вещи не существует. Эмуляция типов сумм в языках, которые их не поддерживают, в лучшем случае неудобна (попробуйте сопоставить шаблон по boost: вариант, например). Поэтому имеет смысл оставить их, если основной целью являются основные языки.

Если вы довольны использованием только haskell/ocaml/всевозможных вариантов выбора. Для haskell есть cereal, binary, safecopy и, возможно, другие. Для ocaml есть piqi project.

+1

Ну, вам не нужны шаблоны, только тегированные союзы. Другим примером может служить protobuf с 3 необязательными полями с ограничением, что только один из них может быть установлен за раз. Я в основном ищу кросс-платформу с поддержкой некоторых основных языков, таких как C++, Java или, возможно, Python. – user239558

+0

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

2

Я не знаю каких-либо практических систем, которые поддерживают типы сумм, отличных от Piqi (я автор). Piqi совместим с протокольными буферами и поддерживает OCaml и Erlang. Одной из причин, почему я его создал, было отсутствие типов сумм в буферах протокола.

Мой план заключается в расширении Piqi для поддержки других языков, таких как Haskell, Clojure и т.д.

0

Есть ли необходимость в формате «высокой производительности»? Многие форматы общего назначения должны иметь возможность просто использовать существующие конструкции - в частности, Maps/hashtables для поддержки союзов (просто включите запись с ключом, указывающим тип фактического значения). Так что, может быть, вы просто можете использовать простое соглашение для использования, скажем, JSON, для передачи такого контента.