protobuf基础概念和认知

Protocol Buffers -  google的数据交换协议。

Protobuf 官方定义:

protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。

序列化[1]:将结构数据或对象转换成能够被存储和传输(例如网络传输)的格式,同时应当要保证这个序列化结果在之后(可能在另一个计算环境中)能够被重建回原来的结构数据或对象。

特点:

语言无关、平台无关。即 ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台

高效。即比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单

扩展性、兼容性好。你可以更新数据结构,而不影响和破坏原有的旧程序

使用protobuf

go 中 

https://github.com/golang/protobuf

protoc --go_out=. *.proto

生成后缀 .pb.go

第一步,创建 .proto 文件,定义数据结构,如下例1所示:

// 例1: 在 xxx.proto 文件中定义 Example1 message

message Example1 {
    optional string stringVal = 1;
    optional bytes bytesVal = 2;
    message EmbeddedMessage {
        int32 int32Val = 1;
        string stringVal = 2;
    }
    optional EmbeddedMessage embeddedExample1 = 3;
    repeated int32 repeatedInt32Val = 4;
    repeated string repeatedStringVal = 5;
}

我们在上例中定义了一个名为 Example1 的 消息,语法很简单,message 关键字后跟上消息名称:

 

message xxx {

}

 

之后我们在其中定义了 message 具有的字段,形式为:

message xxx {

  // 字段规则:required -> 字段只能也必须出现 1 次

  // 字段规则:optional -> 字段可出现 0 次或1次

  // 字段规则:repeated -> 字段可出现任意多次(包括 0)

  // 类型:int32、int64、sint32、sint64、string、32-bit ....

  // 字段编号:0 ~ 536870911(除去 19000 到 19999 之间的数字)

  字段规则 类型 名称 = 字段编号;

}

 =  后的数字为 :编号。

第二步, protoc 编译 .proto 文件生成 读写接口

我们在 .proto 文件中定义了数据结构,这些数据结构是面向开发者和业务程序的,并不面向存储和传输。

当需要把这些数据进行存储或传输时,就需要将这些结构数据进行序列化、反序列化以及读写。那么如何实现呢?不用担心, ProtoBuf 将会为我们提供相应的接口代码。如何提供?答案就是通过 protoc 这个编译器。

// $SRC_DIR: .proto 所在的源目录

// --cpp_out: 生成 c++ 代码

// $DST_DIR: 生成代码的目标目录

// xxx.proto: 要针对哪个 proto 文件生成接口代码

protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto

第三步,调用接口实现序列化、反序列化以及读写

针对第一步中例1定义的 message,我们可以调用第二步中生成的接口,实现测试代码如下:

XML、JSON、ProtoBuf 都具有数据结构化和数据序列化的能力

XML、JSON 更注重数据结构化,关注人类可读性和语义表达能力。ProtoBuf 更注重数据序列化,关注效率、空间、速度,人类可读性差,语义表达能力不足(为保证极致的效率,会舍弃一部分元信息)

ProtoBuf 的应用场景更为明确,XML、JSON 的应用场景更为丰富。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章