Различие между Microsoft Bond и Google Protocol Buffers
Недавно (январь 2015 г.) была выпущена Microsoft с открытым исходным кодом, их инфраструктура для работы с схематизированными данными. Во многих отношениях он похож на буфер протокола Google.
Каковы самые большие различия между этими двумя? Каковы плюсы и минусы, то есть, в каких ситуациях я хотел бы использовать один, а не другой? Конечно, я говорю не об очевидных вещах, таких как согласованность с другими проектами или уже существующими API, а скорее об особенностях обеих библиотек. Чтобы привести пример, Бонд имеет bonded<T>
который, если я правильно помню, не имеет аналога в буферах протокола.
1 ответ
В целом, Bond имеет лучшую систему типов и поддерживает несколько протоколов.
В частности, плюсы:
- Бонд поддерживает дженерики
- Бонд имеет различные типы для представления коллекций:
vector<T>
,map<T>
,list<T>
- Бонд поддерживает ленивую десериализацию (
bonded<T>
) - Bond поддерживает несколько форматов (быстрый двоичный, компактный двоичный, XML, JSON) + маршалинг и транскодирование
Минусы:
- Бонд не поддерживает разные типы для фиксированной и переменной целочисленной кодировки. В Bond способ кодирования целых чисел определяется форматом вывода (быстрый или компактный), но в буферах протокола существуют целочисленные типы, которые всегда имеют фиксированный размер:
fixed32
а такжеfixed64
, - Бонд не поддерживает типы объединений (
oneof
в протоколе буферов) - Бонд не имеет реализации Java (пока)
Я провел несколько тестов, и оказалось, что размер простых сообщений в двоичных форматах Bond и ProtoBuf примерно одинаков. Я сравнил время сериализации и десериализации с использованием библиотеки Bond и C# ProtoBuf: в моем случае Bond работал немного лучше, мой исходный код вы можете найти на GitHub
Подводя итог, я думаю, что лучше использовать Bond, когда вы работаете с некоторыми сложными типами данных или когда вам необходимо представлять одни и те же данные в разных форматах: например, хранить в виде двоичных файлов, но представлять как JSON и т. Д.