Ранее в этом уроке мы с вами познакомились с основами бинарной сериализации и десериализации, и даже в задаче, которая предшествует этому видео, разработали собственную библиотеку, решающую эту задачу, задачу бинарной сериализации. Естественно, в мире существует большое количество уже готовых библиотек, которые точно так же на С++ позволяют бинарно сериализовывать и десериализовывать данные. И далее в этом уроке мы с вами познакомимся с одной из них, а именно Google Protocol Buffers или Protobuf. Это очень широко применяемая библиотека и, на мой взгляд, это тот инструмент, которым нужно пользоваться по умолчанию, когда возникает необходимость выполнять бинарную сериализацию данных. И, давайте посмотрим, как Protobuf устроен на самом верхнем уровне. Когда мы пользуемся библиотекой Google Protocol Buffers в своем проекте, то первым делом мы создаем файл, обычно с расширением proto, в котором описываем схему данных. То есть у нас есть специальный язык, с помощью которого мы описываем, как устроены те данные, которые мы хотим сериализовывать и десериализовывать. Когда этот файл готов, мы подаем его на вход специальному компилятору, который является частью библиотеки Protobuf и этот компилятор генерирует исходный код на том языке программирования, который нам нужен, вы можете видеть на слайде, что он может генерировать как исходники на С++ , так на Python, на Java и на множестве других языков. И вот эти вот файлы, которые мы получили, в нашем случае, на С++, мы уже встраиваем в свой проект и пользуемся ими для того, чтобы выполнять сериализацию наших данных. Давайте, посмотрим на пример proto-файла, вот, собственно, он у меня представлен на экране. Мы вводим два сообщения, person, ну, допустим, мы разрабатываем какую-нибудь адресную книгу или список контактов. И вот, каждого человека в нашем списке контактов мы представляем с помощью определенного набора данных, это имя, это возраст, это набор каких-то номеров телефона, пол и адрес. При этом адрес сам по себе это тоже какая-то структура, это название улицы, номер дома на этой улице и, поэтому мы адрес описываем отдельным сообщением. Собственно, вот так вот выглядит proto-файл и описание данных. Дальше. Если этот proto-файл подать на вход специальному компилятору, то получится код на языке С++, где каждому сообщению будет поставлен в соответствие класс. Вот у нас есть сообщение Person и для него будет сгенерирован класс, который также имеет имя Person и в этом классе есть большой набор методов для работы с отдельными полями нашего сообщения, то есть можно, например, узнавать, сколько у нас уже сохранено номеров телефона, имя нашего контакта, его можно задавать это имя и так далее. Здесь приведена лишь часть генерируемых методов, мы далее рассмотрим более подробно, какие именно методы для каких полей генерируются. И в своем коде мы пользуемся сгенерированными классами, как самыми обычными классами языка С++, то есть, например, как представлено на экране, мы создаем объект типа Address и заполняем, собственно, поля этого адреса. Дальше создаем объект типа Person, иннициализируем его, указываем возраст, адрес, пол, имя, телефон и в конечном итоге с помощью метода SerializeToOStream мы это сообщение сериализуем в поток вывода. Естественно, библиотека предоставляет методы и для десериализации, мы с ними далее также познакомимся. Собственно, дальше нам с вами нужно научиться устанавливать на свой компьютер библиотеку Protobuf и подключать ее к своему проекту. Чем мы с вами и займемся.