Go: Protocol Buffers

Protocol Buffers — протокол сериализации структурированных данных, предложенный Google как эффективная бинарная альтернатива XML. Разработчики сообщают, что Protocol Buffers проще, компактнее и быстрее, чем XML. Для его использования сначала нужно описать структуру данных, которая затем компилируется в классы. Вместе с классами идёт код их сериализации в компактном формате представления. Чтение и запись данных доступна в высокоуровневых языках программирования — таких как С++, Java, Go, Python и др.

Если сравнить Protocol Buffers и XML, то они имеет следующие преимущества:

  • Проще
  • Компактнее более чем в 3 раза (известный факт, что после перехода на Protocol Buffer размер базы данных Twitter уменьшался в 10)
  • Минимум в 20 раз быстрее
  • Более однозначный
  • Позволяет создавать классы, которые в дальнейшем легче использовать программно

Попробуем определить формат сообщения. Для этого создадим файл person.proto со следующий содержимым:

syntax = "proto3";
package pb;

message Person {
  string name = 1;
  int32 id = 2;
  string email = 3;
}

syntax - определяет версию синтаксиса. package - название пакета. Формат сообщения прост и нагляден. Получить больше информации по формату proto файлов можно в документации.

Далее нужно скомпилировать сообщение для использования в коде программы это делает при помощи специального компилятора (protoc). Который можно скачать для Linux по следующей ссылке

Для использования в C++, Java, Python этого достаточно, для Go нужно установить специальный плагин к нему. Это делается следующей командой:

go get -u github.com/golang/protobuf/protoc-gen-go

После чего нужно в переменную PATH добавить директорию содержащую protoc-gen-go, по умочанию это $GOPATH/bin . Теперь можно выполнить компиляцию

protoc -I=$SRC_DIR --go_out=./pb $SRC_DIR/person.proto

На выходе получаем файл person.pb.go в директории pb. Далее создаем объект полученного класса:

p := &pb.Person{
    Id:    proto.Int32(1234),
    Name:  proto.String("John Doe"),
    Email: proto.String("jdoe@example.com"),
}

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

out, err := proto.Marshal(p)
if err != nil {
        log.Fatalln("Failed to encode person:", err)
}

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

if err := proto.Unmarshal(in, p); err != nil {
        log.Fatalln("Failed to parse person:", err)
}

Полный текст программы ниже:

package main

import (
  "github.com/golang/protobuf/proto"
  "./pb"
  "log"
)

func main() {

   p := &pb.Person{
        Id:    proto.Int32(1234),
        Name:  proto.String("John Doe"),
        Email: proto.String("jdoe@example.com"),
    }

    out, err := proto.Marshal(p)
    if err != nil {
            log.Fatalln("Failed to encode person:", err)
    }

    if err := proto.Unmarshal(out, p); err != nil {
            log.Fatalln("Failed to parse person:", err)
    }
}
Тэги: go golang protobuf protocol buffers программирование


 


 
архив

подписка