Установка Protobuf и примеры использования Python, C#

Python

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

Если номер версии отображается успешно, установка прошла успешно. Как показано ниже:

protobuf 安装(1).png

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.

В 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. Таким образом, результат сериализации одинаков для обоих языков.