首页 > 其他分享 >Protobuf

Protobuf

时间:2024-08-24 19:26:26浏览次数:10  
标签:Protobuf err proto Person message 序列化 string

什么是protobuf

数据在进行网络传输的时候,需要进行序列化,序列化协议有很多种,比如xml, json,protobuf等
gRPC默认使用protocol buffers,这是google开源的一套成熟的结构数据序列化机制。

简单使用

定义一种源文件,扩展名为 .proto,使用这种源文件,可以定义存储类的内容(消息类型)。
protobuf有自己的编译器 protoc,可以将 .proto 编译成对应语言的文件,就可以进行使用了。

工具安装

brew install protobuf
get github.com/golang/protobuf/protoc-gen-go

文件创建

// 指定的当前proto语法的版本,有2和3  
syntax = "proto3";  
//option go_package = "path;name"; path 表示生成的go文件的存放地址,会自动生成目录的  
// name 表示生成的go文件所属的包名  
option go_package="/service";  
// 指定等会文件生成出来的package  
package service;  
  
message User {  
  string username = 1;  
  int32 age = 2;  
}

使用命令生成对应的GO文件

 protoc --go_out=. user.proto

代码使用

package main  
  
import (  
    "clinet/service"  
    "fmt"    "google.golang.org/protobuf/proto")  
  
func main() {  
    user := &service.User{  
       Username: "mszlu",  
       Age:      20,  
    }  
    //转换为protobuf  
    marshal, err := proto.Marshal(user) //将这个 User 对象编码为 Protobuf 格式的字节数组 ([]byte)。  
    if err != nil {  
       panic(err)  
    }  
  
    newUser := &service.User{}  
    err = proto.Unmarshal(marshal, newUser)//将字节数组解码回 User 对象  
    if err != nil {  
       panic(err)  
    }  
    fmt.Println(newUser.String())  
}

proto文件介绍

message使用

一个消息类型是通过关键字message字段指定的。

message User {
  string username = 1;
  int32 age = 2;
}

字段规则

  • required string name = 1;
    这个字段是必填的,意味着在创建和序列化 Person 消息时,必须设置 name 字段的值。否则会报错。在 Go 中,这个字段会被生成为 string 类型。
  • optional int32 age = 2;
    这个字段是可选的,意味着在创建和序列化 Person 消息时,可以不设置 age 字段。如果不设置,则会使用该字段类型的默认值,在这里是 0。在 Go 中,这个字段会被生成为 int32 类型。
  • repeated string phoneNumbers = 3;
    这个字段是可重复的,意味着一个 Person 消息可以有多个电话号码。在序列化和反序列化过程中,这些电话号码的顺序会被保留。在 Go 中,这个字段会被生成为 []string 类型的切片。
message Person {
  required string name = 1;
  optional int32 age = 2;
  repeated string phoneNumbers = 3;
}
// 创建一个 Person 消息
person := &Person{
    Name:         "Alice",
    Age:          30,
    PhoneNumbers: []string{"123-456-7890", "987-654-3210"},
}

// 序列化为 Protobuf 二进制数据
data, err := proto.Marshal(person)
if err != nil {
    // 处理错误
}

// 反序列化回 Person 对象
newPerson := &Person{}
err = proto.Unmarshal(data, newPerson)
if err != nil {
    // 处理错误
}

// 输出反序列化后的 Person 对象
fmt.Println(newPerson)

标识号

在消息体的定义中,每个字段都必须要有一个唯一的标识号,标识号是[0,2^29-1]范围内的一个整数。

message Person { 
  string name = 1;  // (位置1)
  int32 id = 2;  
  optional string email = 3;  
  repeated string phones = 4; // (位置4)
}

消息复杂使用

message PersonInfo {
    message Person {
        string name = 1;
        int32 height = 2;
        repeated int32 weight = 3;
    } 
	repeated Person info = 1;
}

如果你想在它的父消息类型的外部重用这个消息类型,你需要以PersonInfo.Person的形式使用它,如:

message PersonMessage {
	PersonInfo.Person info = 1;
}

定义服务

如果想要将消息类型用在RPC系统中,可以在.proto文件中定义一个RPC服务接口,protocol buffer 编译器将会根据所选择的不同语言生成服务接口代码及存根。

service SearchService {
	//rpc 服务的函数名 (传入参数)返回(返回参数)
	rpc Search (SearchRequest) returns (SearchResponse);
}

上述代表表示,定义了一个RPC服务,该方法接收SearchRequest返回SearchResponse

service MyService {
  rpc GetUser(GetUserRequest) returns (GetUserResponse);
  rpc UpdateUser(UpdateUserRequest) returns (UpdateUserResponse);
}

message GetUserRequest {
  string userId = 1;
}

message GetUserResponse {
  User user = 1;
}

message UpdateUserRequest {
  User user = 1;
}

message UpdateUserResponse {
  bool success = 1;
}

message User {
  string name = 1;
  int32 age = 2;
}

MyService 是一个服务,它定义了两个 RPC 方法:

  • GetUser: 输入一个 GetUserRequest,返回一个 GetUserResponse。
  • UpdateUser: 输入一个 UpdateUserRequest,返回一个 UpdateUserResponse。

参考文章

https://mszlu.com/grpc/01/01.html#_3-3-proto文件介绍

标签:Protobuf,err,proto,Person,message,序列化,string
From: https://www.cnblogs.com/Ho1dF0rward/p/18378126

相关文章

  • 关于protobuf的序列化与反序列化
    当我们要使用protobuf进行协议编写,且需要协议在网络中传输的时候,就需要将类或者xxx.proto文件序列化当需要将类序列化,且使用protobuf的时候,我们需要引入Google.Protobuf.Tools3.6.1和protobuf-portable-net2.0.0.668这两个库,版本根据需要自行选择引入类库完成后,将需要序......
  • 关于Protobuf在使用中的一些注意点
    Protobuf是谷歌旗下的一款二进制序列化协议协议的编写在项目中新建一个xxx.proto文件文件的格式第一行写protobuf的版本syntax="proto3";第二行写包的名字在C#中就说命名空间的名字,避免重复例如packageTest;接下来写协议内容例如以下示例关于protobuf的具体语法......
  • 解密Protobuf:高效数据传输的秘密武器
    简介ProtocolBuffers(简称Protobuf)是由Google开发的一种用于数据序列化技术。与传统的XML和JSON相比,Protobuf具有更高的性能和更小的消息体积,特别适用于需要高效数据交换的场景特点速度快:Protobuf在序列化与反序列化数据时速度极快占空间小:Protobuf序列化后的二进制数据非......
  • 【C++】protobuf的简单使用(通讯录例子)
    protobuf的简单使用(通讯录例子).proto文件的编写保留字段字段唯一编号protobuf的类型enum类型Any类型oneof类型map类型完整通讯录代码.proto文件write文件read文件运行结果.proto文件的编写syntax用于指定protobuf的语法;package当.proto文件编译后再*.pb.h文件中会......
  • protobuf pwn题专项
    protobufpwn准备工作安装protobuf编译器sudoapt-getinstalllibprotobuf-devprotobuf-compiler安装python依赖库pip3installgrpciopip3installgrpcio-toolsgoogleapis-common-protos安装pbtkgitclonehttps://github.com/marin-m/pbtkggbond来自DubheCTF......
  • protobuf编译和安装
    编译环境介绍:ubuntu24.04LTSgcc(Ubuntu13.2.0-23ubuntu4)13.2.0g++(Ubuntu13.2.0-23ubuntu4)13.2.0cmakeversion3.28.3 #下载源码gitclonehttps://github.com/protocolbuffers/protobuf.gitcdprotobufgitsubmoduleupdate--init--recursi......
  • 基于VScode和C++ 实现Protobuf数据格式的通信
    目录1.Protobuf概述1.1定义1.2Protobuf的优势2.Protobuf语法3、序列号和反序列化3.1.pb.h头文件3.2序列化3.3反序列化4、测试用例Protobuf详细讲解链接1.Protobuf概述1.1定义protobuf也叫protocolbuffer是google的一种数据交换的格式,它独立于语......
  • protobuf 25.4编译以及visual studio项目配置
    title:protobuf编译配置date:2024-07-2716:00:00categories:other工具安装tags:MSProtobuf下载官方下载地址https://github.com/protocolbuffers/protobuf/releases版本没必要最新,注意自22.0版本开始,有重大改变,CMakelist移至根目录而不是cmake文件夹,......
  • protobuf 随笔记录
    一:抓包,将得到的protobuf数据的hex保存为bin文件,后续使用一下代码,将得到的乱码数据打印出来对应的类型importblackboxprotobufwithopen("pb.bin","rb")asf:data=f.read()parsed_data=blackboxprotobuf.decode_message(data)二:得到的类型数据如下:({'1':1,'2':20,......
  • ImportError:无法从“google.protobuf”导入名称“runtime_version”
    PSD:\RealTimeObjectDetection>pythonTensorflow/models/research/object_detection/model_main_tf2.py--model_dir=Tensorflow/workspace/models/my_ssd_mobnet--pipeline_config_path=Tensorflow/workspace/models/my_ssd_mobnet/pipeline.config--num_train_step......