01|Введение
Protobuf (Protocol Buffers) — это межъязыковой, кроссплатформенный расширяемый механизм, разработанный Google для сериализации структурированных данных.
По сравнению с форматами XML и JSON protobuf меньше, быстрее и удобнее. В настоящее время protobuf поддерживает C++, Java, Python, Objective-C, а если используется proto3, также поддерживаются C#, Ruby, Go, PHP, JavaScript и другие языки.
Адрес официального сайта:developer.Google.capable/номер протокола…
Адрес гитхаба:Раздел GitHub.com/protocol…
преимущество:
- хорошая производительность
- кросс язык
недостаток:
- Плохая читаемость в двоичном формате: для повышения производительности protobuf использует двоичный формат для кодирования, что напрямую приводит к плохой читаемости.
- Отсутствие самоописания: XML является самоописываемым, а protobuf — нет, и, похоже, он не работает без определенной структуры.
02 | Установка
2.1 Установка под Windows
ссылка для скачивания:Раздел GitHub.com/protocol…
Загрузите protoc-3.9.1-win64.zip, это скомпилированный сжатый пакет, который эквивалентен зеленой версии.После распаковки просто добавьте каталог bin под ним в переменную среды, что избавляет от проблем с установкой.
Затем откройте командную строку и введите команду:
protoc --version
Если номер версии отображается успешно, установка прошла успешно. Как показано ниже:
03 | Простота в использовании
3.1 Компиляция
Чтобы использовать protobuf, вам сначала нужно определить файл .proto.Давайте рассмотрим простой пример.
Определите файл Person.proto со следующим содержимым:
syntax = "proto3";
package Test;
message Person {
string Name = 1;
int32 Age = 2;
bool Marriage = 3;
}
-
syntax = "proto3";Указывает, что используется синтаксис proto3, иначе protobuf по умолчанию будет использовать proto2. -
package Test;Указывает пространство имен (в C#). -
messageключевое слово, определяющее структурированные данные. - Число после знака равенства является уникальным номером поля (Обратите внимание не на значение поля), используемый для идентификации полей в сообщениях двоичного формата.
protoc — это компилятор, поставляемый с protobuf., вы можете скомпилировать файл .proto в код на нескольких языках, таких как java, python, go, C# и т. д., и напрямую ссылаться на него.
Команда компиляции:
protoc -I=E:\GL\Test2017 --python_out=E:\GL\Test2017 Person.proto
Описание команды компиляции:
- -I указывает путь к папке, в которой находятся исходные файлы (файлы .proto).
- --python_out указывает, что целевым языком является python, и указывает каталог, в котором хранятся сгенерированные файлы .py. Соответственно C# — это csharp_out,
- Person.proto — это имя исходного файла, если их несколько, разделите их пробелами.
3.2 Пример Python
Установитьprotobuf.
Вызовите команду compile, чтобы скомпилировать Person.proto, и сгенерируйте файл после компиляции:Person_pb2.py, добавленные в проект, примеры сериализации и десериализации выглядят следующим образом:
import Person_pb2
person = Person_pb2.Person()
person.Name = '张三'
person.Age = 20
person.Marriage = True
# 序列化
b = person.SerializeToString()
print(b)
# 反序列化
p = Person_pb2.Person()
p.ParseFromString(b)
print(f'Name: {p.Name}; Age: {p.Age}; Marriage: {p.Marriage}')
вывод:
b'\n\x06\xe5\xbc\xa0\xe4\xb8\x89\x10\x14\x18\x01'
Name: 张三; Age: 20; Marriage: True
Обратите внимание, что вы не можете написать это, это неправильно:
p = Person_pb2.Person().ParseFromString(b)
3.3 Пример C#
Существует 3 версии Protobuf под C#:
- Google.ProtoBuf: официальная версия Google,GitHub.com/Google/pro Т…
- protobuf-net: версия сообщества .net, разработанная энтузиастами сообщества .net,GitHub.com/M гравий/обманчивый…
- Google.ProtocolBuffers: говорят, что он был разработан сотрудниками Google .net до того, как вышла официальная версия.GitHub.com/psychoforehead/pro T…
Здесь мы представляем официальную версию Google.
В VS установите пакет google.protobuf через NuGet.
using Google.Protobuf;
using System;
using Test;
namespace Protobuf
{
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "张三";
person.Age = 20;
person.Marriage = true;
// 序列化
byte[] buffer = person.ToByteArray();
foreach (byte b in buffer)
{
Console.Write(b.ToString("X2") + " ");
}
Console.WriteLine();
// 反序列化
Person p = Person.Parser.ParseFrom(buffer);
Console.WriteLine(string.Format("Name: {0}, Age: {1}, Marriage: {2}", p.Name, p.Age, p.Marriage));
Console.Read();
}
}
}
вывод:
0A 06 E5 BC A0 E4 B8 89 10 14 18 01
Name: 张三, Age: 20, Marriage: True
Сравнивая вывод Python, кажется другим, первый байт в Python — это \n, а здесь 0A. \n Значение в ASCII равно 0A. Таким образом, результат сериализации одинаков для обоих языков.