- 1.protobuf是二进制存储的;xml和json都是文本存储的
- 2.protobuf不需要存储额外的信息;
- protobuf(protocol buffer)是google 的一种数据交换的格式,它独立于平台语言。
google 提供了protobuf多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。
由于它是一种二进制的格式,比使用 xml(20倍) 、json(10倍)进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。
protoc test.proto --cpp_out=./ g++ main.cc test.pb.cc -lprotobuf
.proto
syntax = "proto3"; // 声明了protobuf的版本
package fixbug; // 声明了代码所在的包(对于C++来说是namespace)
// 定义下面的选项,表示生成service服务类和rpc方法描述,默认不生成
option cc_generic_services = true;
message ResultCode
{
int32 errcode = 1;
bytes errmsg = 2;
}
// 数据 列表 映射表
// 定义登录请求消息类型 name pwd
message LoginRequest
{
string name = 1;
string pwd = 2;
}
main
// 封装了login请求对象的数据
LoginRequest req;
req.set_name("zhang san");
req.set_pwd("123456");
// 对象数据序列化 =》 char*
std::string send_str;
if (req.SerializeToString(&send_str))
{
std::cout << send_str.c_str() << std::endl;
}
// 从send_str反序列化一个login请求对象
LoginRequest reqB;
if (reqB.ParseFromString(send_str))
{
std::cout << reqB.name() << std::endl;
std::cout << reqB.pwd() << std::endl;
}
return 0;
打印
//序列化 zhang san123456 //反序列化 zhang san 123456
很少都会用string 都会用bytes,当然结果都没影响
// 数据 列表 映射表
// 定义登录请求消息类型 name pwd
message LoginRequest
{
bytes name = 1;
bytes pwd = 2;
}
实践2(列表)
message ResultCode
{
int32 errcode = 1;
bytes errmsg = 2;
}
// 定义登录响应消息类型
message LoginResponse
{
ResultCode result = 1;
bool success = 2;
}
message GetFriendListsRequest
{
uint32 userid = 1;
}
message User
{
bytes name = 1;
uint32 age = 2;
enum Sex
{
MAN = 0;
WOMAN = 1;
}
Sex sex = 3;
}
message GetFriendListsResponse
{
ResultCode result = 1;
repeated User friend_list = 2; // 定义了一个列表类型
}
int main()
{
// LoginResponse rsp;
// ResultCode *rc = rsp.mutable_result();
// rc->set_errcode(1);
// rc->set_errmsg("登录处理失败了");
GetFriendListsResponse rsp;
ResultCode *rc = rsp.mutable_result();//得返回可以修改的
rc->set_errcode(0);
User *user1 = rsp.add_friend_list();
user1->set_name("zhang san");
user1->set_age(20);
user1->set_sex(User::MAN);
User *user2 = rsp.add_friend_list();
user2->set_name("li si");
user2->set_age(22);
user2->set_sex(User::MAN);
std::cout << rsp.friend_list_size() << std::endl;
return 0;
}
在protobuf里面怎么定义描述Rpc方法的类型
message LoginRequest
{
bytes name = 1;
bytes pwd = 2;
}
// 定义登录响应消息类型
message LoginResponse
{
ResultCode result = 1;
bool success = 2;
}
message GetFriendListsRequest
{
uint32 userid = 1;
}
message GetFriendListsResponse
{
ResultCode result = 1;
repeated User friend_list = 2; // 定义了一个列表类型
}
service 服务方法
一定要加选项
定义下面的选项,表示生成service服务类和rpc方法描述,默认不生成
option cc_generic_services = true;
// 在protobuf里面怎么定义描述rpc方法的类型 - service
service UserServiceRpc
{
rpc Login(LoginRequest) returns(LoginResponse);
rpc GetFriendLists(GetFriendListsRequest) returns(GetFriendListsResponse);
}
protobuf底层原理



