protobuf 测试使用
1 介绍
Protocol buffers are a flexible, efficient, automated mechanism for serializing structured data – think XML, but smaller, faster, and simpler.
2 Example:
2.1 定义proto文件
addrbook.proto
message Person {
required string name = 1;
required int32 id = 2;
optional string email = 3;
enum PhoneType {
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber {
required string number = 1;
optional PhoneType type = 2 [default = HOME];
}
repeated PhoneNumber phone = 4;
}
2.2 编译:
protoc.exe -I=./ --cpp_out=./ ./addrbook.proto
生成文件:addrbook.pb.cc addrbook.pb.h
2.3 使用
(依赖库:libprotoc.lib;libprotobuf.lib
2.3.1 序列化
Person person;
person.set_id(10);
person.set_name("protobuf");
person.set_email("test@gmail.com");
Person::PhoneNumber* phone_num1 = person.add_phone();
phone_num1->set_number("12345678");
phone_num1->set_type(Person_PhoneType::Person_PhoneType_MOBILE);
Person::PhoneNumber* phone_num2 = person.add_phone();
phone_num2->set_number("123456780");
std::string ouput;
size_t size = person.ByteSize();
person.SerializeToString(&ouput);
/* 使用string做需要的操作 */
2.3.2 反序列化
Person person;
person.ParseFromString(in);
std::string name = person.name();
int id = person.id();
std::string email = person.email();
int num = person.phone_size();
Person::PhoneNumber* phone = new Person::PhoneNumber[num];
for (size_t i = 0; i < num; ++i)
{
phone[i] = person.phone(i);
std::string phone_num = phone[i].number();
int type = phone[i].type();
}
3 Why not just use XML?
Protocol buffers have many advantages over XML for serializing structured data. Protocol buffers:
- are simpler
- are 3 to 10 times smaller
- are 20 to 100 times faster
- are less ambiguous
- generate data access classes that are easier to use programmatically
Json、XML、ProtoBuf特点比较
Json
- human readable/editable
- can be parsed without knowing schema in advance
- excellent browser support
- less verbose than XML
XML
- human readable/editable
- can be parsed without knowing schema in advance
- standard for SOAP etc
- good tooling support (xsd, xslt, sax, dom, etc)
- pretty verbose
Protobuf
- very dense data (small output)
- hard to robustly decode without knowing the schema (data format is internally ambiguous, and needs schema to clarify)
- very fast processing
- not intended for human eyes (dense binary)
All have good support on most platforms.
以上均为网上整理
另通过ICE和protobuf写了个简单的测试例子:http://pan.baidu.com/s/1i3oPfdN
protobuf 测试使用的更多相关文章
- linux protobuf 测试官方例子遇到报错及解决办法。
测试例子时出现报错如下,在最下面会写出安装流程. -------------------------------------报错----1------------------------------- ...
- Netty5 + Protobuf 使用
1. 安装开发环境 1.1 Netty环境 这里我使用Netty5.0.0版本 到这里下载即可http://netty.io/ 下载netty-all-5.0.0.Alpha2.jar 这个jar包简 ...
- 在centos 6.9下Protocol Buffers数据传输及存储协议的使用(python)
我们知道Protocol Buffers是Google定义的一种跨语言.跨平台.可扩展的数据传输及存储的协议,因为将字段协议分别放在传输两端,传输数据中只包含数据本身,不需要包含字段说明,所以传输数据 ...
- Protobuf for Python测试保存和读取文件
安装pip, setuptools, and wheel 如果已经从python.org,安装啦Python 2 >=2.7.9 or Python 3 >=3.4 ,那么就已经有啦pip ...
- protobuf 安装 及 小测试
参考:http://shift-alt-ctrl.iteye.com/blog/2210885 版本: 2.5.0 百度云盘上有jar包. mac 上安装: 新建:/Users/zj/software ...
- protobuf简单测试应用
protobuf是google推出的一种数据交换协议,比较适合应用于底层服务交互,nodejs提供protobufjs包的实现,下面是一个简单的测试demo: 首先是.proto文件: package ...
- 测试Websocket建立通信,使用protobuf格式交换数据
接到一个应用测试,应用实现主要使用websocket保持长链接,使用protobuf格式交换数据,用途为发送消息,需要我们测试评估性能,初步评估需要测试长链接数.峰值消息数以及长期运行稳定性 整体需求 ...
- 如何用jmeter对websockt和protobuf进行压力测试
参考代码:https://github.com/hutao722/kekexinxin 这是基于Jmeter WebsocketSampler的插件,支持对基于websocket和protobuf的服 ...
- 如何用jmeter对websock和protobuf进行压力测试
1. 一个websocket插件官网地址 https://github.com/maciejzaleski/JMeter-WebSocketSampler 2. 可以用上述插件,也可以自己扩展,以实现 ...
随机推荐
- centos6.5下编译安装mariadb-10.0.20
源码编译安装mariadb-10.0.20.tar.gz 一.安装cmake编译工具 跨平台编译器 # yum install -y gcc* # yum install -y cmake 解决依赖关 ...
- Android JAR包、Library项目
[JAR包] android引入JAR包,打包成JAR包,打包成Library项目,导入Library项目 (1)项目导入JAR包:1.在项目目录里建立一个libs目录,将外部jar包拷贝在里面.2. ...
- JS/Jquery版本的俄罗斯方块(附源码分析)
转载于http://blog.csdn.net/unionline/article/details/63250597 且后续更新于此 1.前言 写这个jQuery版本的小游戏的缘由在于我想通过从零到有 ...
- CentOS7图形界面与命令行界面切换
1.如果在命令行模式,按Ctrl+Alt+F1,可以进入图形界面: 2.如果在图形界面下,按:Ctrl+Alt+F2,可以进入命令行模式:
- laravel 事件广播
Laravel 5.1 之中新加入了事件广播的功能,作用是把服务器中触发的事件通过websocket服务通知客户端,也就是浏览器,客户端js根据接受到的事件,做出相应动作.本文会用简单的代码展示一个事 ...
- php中0,空,null和false之间区别
$a = 0; $b="0"; $c= ''; $d= null; $e = false; echo "5个变量-原始测试类型"; var_dump($a);/ ...
- hdu 1542 线段树+扫描线 学习
学习扫描线ing... 玄学的东西... 扫描线其实就是用一条假想的线去扫描一堆矩形,借以求出他们的面积或周长(这一篇是面积,下一篇是周长) 扫描线求面积的主要思想就是对一个二维的矩形的某一维上建立一 ...
- 性能测试四十:Mysql存储过程造数据
性能测试是基于大量数据的,而进行性能测试之前肯定没那么多数据,所以就要自己准备数据 数据构造方法: 1.业务接口 -- 适合数据表关系复杂 -- 优点:数据完整性比较好2.存储过程 -- 适合表数量少 ...
- 性能测试二十五:redis-cli 命令总结
常用命令dbsize:查看redis中的kv数量 keys *:查看redis中所有的keyset key_1 v_1:新增一个key_1,包含v_1get key_1:查看key_1中的内容del ...
- python 全栈开发,Day56(jQuery的ajax)
昨日内容回顾 事件流: 1.事件捕获 从最外层到最内层 2.事件目标阶段 3.事件冒泡 从最内层到最外层 每个事件都会事件对象 event 属性和方法 属性: event.target 目标节点(冒泡 ...