Познакомьтесь с Бондом, Microsoft Bond — новой структурой сериализации данных

Опубликовано: 2022-03-11

Microsoft Bond — это новая платформа сериализации для схематизированных данных, созданная Microsoft.

Давайте вспомним, где чаще всего используется сериализация данных:

  • Сохранение данных в файлах, потоках, NoSQL и BigData.
  • Передача данных в сетях, IPC и т.д.

Обычно этим приложениям приходится иметь дело со схематизированными данными, где схема означает:

  • Структура: иерархия, отношения, порядок.
  • Семантика: возраст в количестве лет с момента рождения.

платформа сериализации данных Microsoft Bond

На самом деле любые данные имеют схему, даже если она неявно определена или поддерживается вашим языком программирования «из коробки». Когда дело доходит до сложных структур данных, мы в конечном итоге пишем вспомогательные объекты передачи данных (DTO) и код, отвечающий за ввод-вывод, часто на разных языках. Как только он растет и развивается, обслуживание всех этих частей быстро становится кошмаром. Вот где фреймворки сериализации выигрывают.

Прежде всего, любая структура сериализации определяет абстракцию для определения схемы данных, которая не привязана к конкретному языку программирования или платформе. Эта абстракция известна как DSL (предметно-ориентированный язык).

Имея такой DSL, мы можем определить схему данных для конкретного приложения. Определение, в свою очередь, может быть выражено в нескольких формах, но часто структуры сериализации поддерживают единую форму, которая хорошо подходит для его DSL. Слишком сложно? Вот один известный пример: XSD и XML.

XSD определяет DSL, XML (рекомендуется) для определения документов, соответствующих схеме XSD. Но вы также можете использовать «xsd.exe» для создания классов DTO, соответствующих XSD, поэтому сгенерированные классы — это просто другая форма. Обратите внимание, что вы можете генерировать XML из DTO и наоборот, и они будут семантически идентичными, потому что семантика является общей: она определяется с помощью XSD. Подводя итог, можно сказать, что инфраструктура сериализации предоставляет вам DSL, который вы используете для определения схем данных в определенном формате, который лучше всего поддерживается данной инфраструктурой.

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

Они генерируют весь вспомогательный код для целевых языков программирования, который необходим клиентам для работы со схематизированными данными: DTO, прокси и т. д. В конечном итоге это требуется для строго типизированных языков, в то время как это может быть необязательным для утиных (динамических) языков. .

Последним, но не менее важным вопросом является сохранение данных в сети. Фактические данные должны быть в конечном итоге сериализованы в необработанные байты (или текст) и десериализованы обратно.

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

Представьте, что фреймворк готов поддерживать протокол JSON, тогда он должен предоставить средства чтения/записи JSON, скажем, для C#, C++, Windows, Linux и т. д.

Собираем все вместе: любой современный фреймворк для сериализации данных предоставляет вам следующее:

  • Абстракции: DSL и протоколы.
  • Инструменты генерации кода.
  • Реализации протокола.

Microsoft Bond — это современная структура сериализации данных. Он предоставляет мощный DSL и гибкие протоколы, генераторы кода для C++ и C#, эффективные реализации протоколов для Windows, Linux и Mac OS X.

В течение нескольких лет Bond оставался технологией только для внутреннего использования, но благодаря инициативе Microsoft Open Source Bond стал доступен на GitHub: Microsoft Bond.

Конкуренты в области сериализации данных

Соперничество среди софтверных гигантов привело к появлению ряда фреймворков сериализации:

  • Google Inc. — Буферы протокола Google
  • Facebook Inc. - Thrift, который теперь поддерживается Apache.
  • Программное обеспечение Apache Foundation — Avro

Очевидно, что все они несовместимы, и это нормально, если вы не создадите свой публичный API, используя один из них.

Каждый из них имеет свои плюсы и минусы, поэтому вы можете выбрать из них в зависимости от ваших потребностей.

Почему Бонд?

Официальный ответ на этот вопрос здесь: «Почему Бонд».

Вот краткий обзор:

  • Bond поддерживает богатую систему типов, включая дженерики.
  • Bond поддерживает управление версиями схемы и двустороннюю совместимость.
  • Bond поддерживает манипулирование схемой во время выполнения.
  • Бонд поддерживает различные коллекции: «вектор , карта , список ».
  • Bond поддерживает типобезопасную ленивую сериализацию: «bonded
  • Bond поддерживает сменные протоколы (форматы) с маршалингом и транскодированием.

Важно отметить, что Бонд следует стратегии «плати, чтобы играть». Чем больше функций вы добавляете/используете, тем больше вы платите за размер и скорость. Это дает разработчикам большую гибкость.

Давайте будем честными и перечислим и недостатки:

  • Bond нацелен на стек Microsoft с поддержкой C++ и C#, но без поддержки Java (пока).
  • Bond не поддерживает тип объединения («oneof» в protobuf).

Что насчет производительности?

Когда дело доходит до сравнения одной платформы с другой, разработчики часто ищут сравнение производительности. Но давайте вспомним, что эти фреймворки состоят из DSL, генераторов кода и протоколов. Если вы рассматриваете только производительность протоколов, вы упустите возможности, предоставляемые DSL и codegens. Иногда лучший DSL гораздо важнее, чем разница в скорости сериализации на несколько процентов.

Помимо скорости, важную роль могут также играть компактные кодировки, поддерживаемые некоторыми протоколами. Я рекомендую вам провести сравнение производительности/пространства с данными вашего домена. Это единственный способ оценить все преимущества, которые вы можете получить от конкретного фреймворка.

облигация майкрософт

Эта статья поставляется с демонстрационным проектом, который демонстрирует использование платформы Bond путем чтения всех записей из журнала событий приложений Windows, сериализации их как объектов Bond и десериализации их обратно.

Чтобы собрать и запустить демонстрационную версию, вам не нужно устанавливать какое-либо программное обеспечение, кроме Visual Studio.

Использование Microsoft Bond

Получение облигации

Ознакомьтесь с официальным руководством по получению Bond для вашей платформы (платформ).

Для проектов .NET это так же просто, как:

 install-package Bond.CSharp

В комплект входят:

  • Генератор кода (gbc.exe) в папке bin
  • .NET-библиотеки
  • Задачи MSBuild

Рабочий процесс

Рабочий процесс включает в себя следующие шаги:

  • Изучите DSL и определите схему данных, написав файл(ы) «.bond».
  • Используйте генератор кода («gbc.exe»), чтобы получить DTO для вашего языка программирования.
  • Ссылайтесь на сгенерированные файлы, а также библиотеки времени выполнения Bond в своем проекте.

Рассмотрите возможность использования задач MSBuild, поставляемых с платформой, для автоматизации этапа создания кода.

Обзор функций DSL

Когда вы начнете писать свой первый файл «.bond», вам нужно будет знать его синтаксис и особенности. Пожалуйста, посетите официальную страницу документации с подробным описанием IDL. Давайте рассмотрим только основные функции:

  • Модули: схема может быть разбита на разные файлы, которые включаются в оператор «импорт».
  • Пространство имен: имеет то же значение, что и C++/C#.
  • Пользовательские структуры: единица определения пользовательского типа.
  • Упреждающее объявление полезно для рекурсивных структур данных.
  • Основные типы: «bool, uint8 (до 64), int8 (до 64), float, double, string, wstring».
  • Типы контейнеров: «blob, list , вектор , задавать , map<K, T>, допускающий значение NULL ».
  • Пользовательские типизированные псевдонимы и сопоставления, например, если вы хотите иметь «DateTime» в C#, но галочки («int64») на проводе.
  • Пользовательские атрибуты: полезны для генерации пользовательского кода.

Скучающий? Вот пример:

 namespace MyProject struct MyRecord { 0: string Name = "Noname"; 1: vector<double> Constants; }

где «0» и «1» — порядковые номера полей (могут быть любыми целыми числами с любым темпом) и = "Noname" — это (необязательное) значение по умолчанию.

Генерация кода

Платформа Bond предоставляет инструмент для генерации кода, написанный на Haskell. Вот как сгенерировать код C# и C++ из схемы «.bond» в командной строке:

 gbc c# example.bond gbc c++ example.bond

Поддерживаемые протоколы (форматы)

«Из коробки» Bond поддерживает три вида протоколов:

  • Протоколы с тегами: «CompactBinary» и «FastBinary».

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

  • Протоколы без тегов: «SimpleBinary»

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

  • Протоколы на основе DOM: «SimpleJson» и «SimpleXml»

Протокол на основе DOM анализирует всю полезную нагрузку в объектной модели данных в памяти, которая затем запрашивается во время десериализации. Обычно этот тип протокола используется для реализации текстовых кодировок, таких как JSON или XML.

Для каждого протокола библиотека времени выполнения Bond предоставляет вам соответствующие классы Reader и Writer, которые выполняют работу по фактической сериализации.

Использовать протоколы довольно просто и немного сложнее, чем знаменитый «JsonConvert.SerializeObject()»:

 var record = new MyRecord { Name = "FooBar", Constants = { 3.14, 6.28 } }; var output = new OutputBuffer(); var writer = new CompactBinaryWriter<OutputBuffer>(output); Serialize.To(writer, record); var input = new InputBuffer(output.Data); var reader = new CompactBinaryReader<InputBuffer>(input); record = Deserialize<Example>.From(reader);

Что дальше?

Если вы любите Бонда и у вас есть много свободного времени для программирования, подумайте о том, чтобы взять один из этих предметов в разработку. Я не буду перечислять все преимущества, которые вы можете получить от участия, но я знаю, что многие разработчики ищут идеи, в которые можно внести свой вклад:

  • Реализовать порт на Java. Замените Java другими основными языками по вашему выбору.
  • Реализовать импорт/экспорт схемы Bond для обмена с другими DSL (например, «.proto <=> .bond»).

Что бы вы ни решили сделать в отношении Бонда, я рекомендую вам сначала связаться с Адамом Сапеком. Он руководит этим проектом и расскажет вам о том, что наиболее востребовано рынком.