江西城市建设管理协会网站,网站优化推广,大理如何做百度的网站,专业柳州网站建设哪家好文章目录 1. protobuf介绍1.1 ProtoBuf使用场景说明2. 其他序列化介绍2.1 Json2.1.1 使用Json序列化2.1.2 Json反序列化2.2 其他可选地序列化和反序列化3. protoBuf3.1 protobuf数据类型3.2 protobuf使用步骤3.2.1 定义proto文件3.2.2 编译proto文件3.2.2.1 安装protocol buffe… 文章目录 1. protobuf介绍1.1 ProtoBuf使用场景说明 2. 其他序列化介绍2.1 Json2.1.1 使用Json序列化2.1.2 Json反序列化 2.2 其他可选地序列化和反序列化 3. protoBuf3.1 protobuf数据类型3.2 protobuf使用步骤3.2.1 定义proto文件3.2.2 编译proto文件3.2.2.1 安装protocol buffers3.2.2.2 编译proto文件 3.2.3 使用API 3.3 扩展时的注意事项3.4 不同版本差异 本文在学习的角度出发,进行protobuf的使用场景和功能介绍。 原文 1. protobuf介绍
ProtoBuf是中立于编程语言和编程平台的,可扩展的用于序列化结构化数据的解决方案,是Google公司开发的一种数据描述语言,可用于数据存储、通信协议等方面。定义完你所需要的数据结构后,你可以基于protoBuf生成各种语言的代码,这些定义的数据流可以轻松地被传递且不会破坏你已有的程序。并且你也可以更新你的结构体而现有的代码也不会收到任何影响。protoBuf目前支持Objective-C、C++、C#、Jave、Python、Go、PHP、JavaScript等主流语言。1.1 ProtoBuf使用场景说明 工作中结构体数据的传输不仅仅局限于在函数之间传递,常规的函数间传递结构体并不需要做任特殊处理,但在实际中结构体数据的传输可能会在不同的APP之间,例如网络间传输。又或者是相同进程的不同版本,你和你的小伙伴的微信版本很可能是不同的。
例如下面这样一个结构体信息,这可能是一个微信的名片:
typedef struct User{char ID[20];int age;char gender;
}User;User Boss = {"wxid_we48fhb14", 18, 1};假设分享者分享名片时,使用如下代码发送:
sendto(sockfd, (void*)Boss, sizeof(User),0,dest_addr,sizeof(struct sockaddr))服务端采用如下代码接收: char buf[1024] = {0};recvfrom(sockfd, buf, 1024, 0, NULL, NULL);//不保存数据包来源地址和地址类型长度User* pUser = (User*)buf;pUser-ID;pUser-age;这种简单的序列化的做法是,将传输的对象Boss转换为void*进行传输,在接收端进行反序列化就是将void*强转为结构体类型,这种方式是没有问题的。 但是这个前提是认为在发送端和接收端对于User结构体的认知是相同的,如果接收端的版本比较新,对于User的定义是这样的:
typedef struct User{char ID[20];int age;char gender;char province;char city;
}User;此时在接收端进行解析数据是就会发生错误,这种情况下就需要序列化的数据传输格式。
2. 其他序列化介绍 以下介绍的方法是可用且常用的序列化方法,但是其性能并不是特别好。如果对于性能没有强烈的需求,使用起来并没有任何问题。 2.1 Json
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于其他编程语言的文本方式来存储和表示数据,同时也易于机器解析和生成,一般用于网络传输。 同时易于人阅读和编写,在一些配置脚本中也可使用json书写。 比如上面的,使用Json表示的话,可以表示为:
{"ID":"wxid_we48fhb14","age":18,"gender":1,"province":25
}2.1.1 使用Json序列化
C++有json的库,我们将结构体数据转化为json字符串: