Protocol Buffers介绍及例子
Protocol Buffers介绍及例子
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。
protobuf协议是以一个 .proto 后缀的文件为基础,这个文件通过结构化数据类型的形式描述了一个数据信息。
protobuf的序列化底层原理:
you can see, each field in the message definition has a unique numbered tag. These tags are used to identify your fields in the message binary format, and should not be changed once your message type is in use. Note that tags with values in the range 1 through 15 take one byte to encode. Tags in the range 16 through 2047 take two bytes. So you should reserve the tags 1 through 15 for very frequently occurring message elements. Remember to leave some room for frequently occurring elements that might be added in the future.
翻译为:
protobuf协议使用二进制格式表示Key字段;对value而言,不同的类型采用的编码方式也不同,如果是整型,采用二进制表示;如果是字符,会直接原样写入文件或者字符串(不编码)。
公式 field_number << 3)| wire_type,如果域号大于等于16,两个字节共16位,去掉移位的3位,去掉两个字节中第一个比特位, 总共16个比特位只有16-511个比特位用来表示Key,所以Key的域号要小于2^11 2048。
T - L - V 的数据存储方式
- Tag - Length - Value,标识 - 长度 - 字段值 存储方式
 - 以 标识 - 长度 - 字段值 表示单个数据,最终将所有数据拼接成一个 字节流,从而 实现 数据存储 的功能
 
正式因为采用PB自身框架代码和编译器完成和独特的编码方式,才会使protobuf的序列化紧凑,效率这么高。
最初的目录结构:

各文件内容:
cat helloworld.proto
syntax = "proto2";
package lm;
message helloworld
{
    required int32 id = 1;
    required string str = 2;
    optional int32 opt=3;
}
cat main.cpp
#include <iostream>
#include <fstream>
#include "protoc_dir/helloworld.pb.h"
using namespace std;
void ListMsg(const lm::helloworld & msg){
    cout << msg.id()<<endl;
    cout << msg.str()<<endl;
}
int main(void)
{
    lm::helloworld msg1;
    lm::helloworld msg2;
    msg1.set_id(101);     //设置id
    msg1.set_str("helloworld");    //设置字符串
    {
        fstream output("./tst.log", ios::out |ios::trunc |ios::binary);
        if (!msg1.SerializeToOstream(&output)){
            cerr << "failed to serialize msg1" <<endl;
            return -1;
        }
    }
    {
        fstream input("./tst.log",ios::in|ios::binary);
        if (!msg2.ParseFromIstream(&input)){
            cerr << "failed to parse" <<endl;
            return -1;
        }
        ListMsg(msg2);
    }
    return 0;
}
1.根据.proto文件生成.cc .h文件
protoc --cpp_out=./protoc_dir/ helloworld.proto

2.编译源代码
g++ -std=c++11 main.cpp protoc_dir/helloworld.pb.cc -lprotobuf -lpthread  -o obj_run

注意: protobuf用到了多线程, 所以一定要加上 lpthread 
3.运行可执行文件

Protocol Buffers介绍及例子的更多相关文章
- Protocol buffers 介绍
		
Protocol buffers和mxl一样在序列化数据结构时很灵活.高效和智能,但是它的优势在于定义文件更小,读取速度更快,使用更加简单.目前protocol buffers支持C++.java和p ...
 - 开源点评:Protocol Buffers介绍
		
今天来介绍一下“Protocol Buffers”(下面简称protobuf)这个玩意儿.本来俺在构思“生产者/消费者模式 ”系列的下一个帖子:关于生产者和消费者之间的传输数据格式.因为里面扯到了pr ...
 - Google Protocol Buffers介绍
		
简要介绍和总结protobuf的一些关键点,从我之前做的ppt里摘录而成,希望能节省protobuf初学者的入门时间.这是一个简单的Demo. Protobuf 简介 Protobuf全称Google ...
 - Protocol Buffers介绍
		
基本概念 Protocol Buffers(以下简称PB)是一种独立于语言.独立于开发平台.可扩展的序列化数据结构框架,它常常被用在通信.数据序列化保存等方面. PB是一种敏捷.高效.自动化的用于对数 ...
 - Protocol Buffers编码详解,例子,图解
		
Protocol Buffers编码详解,例子,图解 本文不是让你掌握protobuf的使用,而是以超级细致的例子的方式分析protobuf的编码设计.通过此文你可以了解protobuf的数据压缩能力 ...
 - Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南
		
Protocol Buffers(Protobuf) 官方文档--Protobuf语言指南 约定:为方便书写,ProtocolBuffers在下文中将已Protobuf代替. 本指南将向您描述如何使用 ...
 - Protocol Buffers(Protobuf)开发者指南---概览
		
Protocol Buffers(Protobuf)开发者指南---概览 欢迎来到protocol buffers的开发者指南文档,protocol buffers是一个与编程语言无关‘.系统平台无关 ...
 - Protocol Buffers
		
今天来介绍一下"Protocol Buffers"(以下简称protobuf)这个玩意儿.本来俺在构思"生产者/消费者模式"系列的下一个帖子:关于生产者和消费者 ...
 - Protocol Buffers(2):编码与解码
		
目录 Message Structure 解码代码一窥 varint Protobuf中的整数和浮点数 Length-delimited相关类型 小结 参考 博客:blog.shinelee.me | ...
 
随机推荐
- Golang学习系列:(一)介绍和安装
			
Golang学习系列:(一)介绍和安装 Java程序员带你来到Go的世界,让我们开始探索吧! Go是一种新的语言,一种并发的,带有垃圾回收的.快速编译的语言,它具有一下特点: 他可以在一台计算机上用几 ...
 - Tomcat的windows10集群搭建(一台电脑同时运行多个tomcat配置方法)
			
配置方法(好久不配置了,忘记了,今天还是总结下吧): 1.官网下载tomcat ,我下载了tomcat6.0和tomcat7.0(以便区分) 官网地址:http://tomcat.apache.org ...
 - UVa 10537 The Toll! Revisited (最短路)
			
题意:给定一个图,你要从 s 到达 t,当经过大写字母时,要交 ceil(x /20)的税,如果经过小写字母,那么交 1的税,问你到达 t 后还剩下 c 的,那么最少要带多少,并输出一个解,如果多个解 ...
 - SOA和微服务到底是什么关系?
			
SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上的区别,两者说到底都是对外提供接口的一种架构设计方式.我倒觉得微服务其实就是随着互联网的发展,复杂的平台.业务的出现, ...
 - html 中的<script>标签
			
https://www.w3.org/TR/html51/semantics-scripting.html#the-script-element 一. <script type='text/ja ...
 - SpringMVC源码解析 - HandlerAdapter - @SessionAttributes注解处理
			
使用SpringMVC开发时,可以使用@SessionAttributes注解缓存信息.这样业务开发时,就不需要一次次手动操作session保存,读数据. @Controller @RequestMa ...
 - 作业 c++编写
			
1.第一版本程序Prog1:+ 给定一个数组,实现数组元素求和:,具体要求:实现对一维数组(a[100])的所有元素相加运算.+ 数据准备:a)数组长度:100:b)数组数据来源:实验数据A列:1~1 ...
 - mysql快速插入大数据
			
说的是插入数据,这个倒像是载入数据. 上一篇,是按照插入数据来写的,就是insert into,当时插入一万条实在是太慢了,大概是286734毫秒. insert into table values, ...
 - Javascript几个时髦的hack技巧《Javascript Hacks for Hipsters》
			
转自:http://berzniz.com/post/68001735765/javascript-hacks-for-hipsters Javascript Hacks for Hipsters J ...
 - 使用像素单位设置 EXCEL 列宽或行高
			
在导出 Excel 的时候, 经常要需要给列设置宽度或给行设置高度, 在使用 NPOI 或 EppPlus 等组件进行操作的时候, 列宽和行高的单位都不是像素, 好像是英寸,具体是啥也说不清. 平常在 ...