Google Protocol Buffers 反序列化 转
http://www.cnblogs.com/royenhome/archive/2010/10/30/1865256.html
本文作为结束篇,会稍微介绍下怎么反序列化GoogleBuffer数据,并在最后提供本系列文章中所用到的代码整理供下载。
上一篇文章介绍了怎样将数据序列化到了addressbook.data中,那么对于接受方而言该怎么解析出原本的数据呢。同样,protoc编译器生成的代码文件中提供了反序列化的接口,基本上和序列化的函数对应的,如下图所示:
上文中采用了SerializeToOstream、SerializeToString、SerializeToCodedStream来序列化数据的,反序列化反其道行之即可。本文反序列化采用ParseFromArray方式,从某个角度算是对上文的一个补充吧!
反序列化也是分为两个步骤:
1)将数据载入内存或者输入流
2)调用库提供的反序列化接口函数进行反序列化
一、将数据载入
将数据从文件中读出时候,需要注意以二进制的模式打开,且编码格式要指定正确,如下所示:
FILE *g_AddressBook = fopen("addressbook.data","rb,ccs=UNICODE");
if( NULL == g_AddressBook )
{
cerr<<"Open addressbook.data failed!\n"<<endl;
return ;
} int lfilesize = 0;
fseek( g_AddressBook,0,SEEK_END);
lfilesize = ftell( g_AddressBook );
fseek( g_AddressBook ,0,SEEK_SET );
char *buffer =new char[lfilesize+1];
if( NULL == buffer )
{
cerr<<"malloc memory error!\n";
return;
}
memset(buffer,'\0',sizeof(buffer));
fread( buffer,sizeof(char),lfilesize,g_AddressBook);
if( g_AddressBook )
{
fclose(g_AddressBook);
g_AddressBook = NULL;
}
二、反序列化
上述代码将addressbook.data中的数据载入了buffer中,接着我们就可以将其作为参数传给ParseFromArray来反序列化,并格式化输出到控制台,如下:
AddressBook addressBook;
addressBook.par
addressBook.Clear(); if( !addressBook.ParseFromArray(buffer,lfilesize) )
{
cerr<<"Deserial from addressbook.data failed!\n";
return;
} int personSize = addressBook.person_size(); for( int i=0 ;i<personSize; i++ )
{
Person p = addressBook.person( i );
cout<<"Person "<<i+1<<":\nid\t"<<p.id()<<"\nname:\t"<<p.name()<<"\n";
int phoneSize = p.phone_size();
for( int j=0;j<phoneSize;j++ )
{
Person_PhoneNumber phone = p.phone(j);
cout<<"Phone "<<j+1<<":\nType:\t";
switch( phone.type())
{
case Person_PhoneType_MOBILE:
cout<<"Mobile\t\tPhone Number:\t"<<phone.number()<<endl;
break;
case Person_PhoneType_HOME:
cout<<"Home\t\tPhone Number:\t"<<phone.number()<<endl;
break;
case Person_PhoneType_WORK:
cout<<"Work\t\tPhone Number:\t"<<phone.number()<<endl;
break;
default:
cout<<"Unkown\n";
break;
}
}
cout<<endl;
}
运行结果如下所示:
好了,相信通过本系列文章,读者应该对Google Protocol Buffer有一定的认识了吧。当然,想要更深入的了解,还是参考Google的官方在线文档吧!
示例代码下载地址:SerialProtocolBuffer示例代码
Google Protocol Buffers 反序列化 转的更多相关文章
- Google Protocol Buffers 入门
Google Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化.它很适合做数据存储或 RPC 数据交换格式.可用于通讯协议.数据存储等领域的 ...
- Google Protocol Buffers介绍
简要介绍和总结protobuf的一些关键点,从我之前做的ppt里摘录而成,希望能节省protobuf初学者的入门时间.这是一个简单的Demo. Protobuf 简介 Protobuf全称Google ...
- C# 使用Google Protocol Buffers
Google Protocol Buffers 使用3.0版本 下载protoc.exe 下载链接 https://github.com/protocolbuffers/protobuf/releas ...
- Google Protocol Buffers 快速入门(带生成C#源码的方法)
Google Protocol Buffers是google出品的一个协议生成工具,特点就是跨平台,效率高,速度快,对我们自己的程序定义和使用私有协议很有帮助. Protocol Buffers入门: ...
- Google Protocol Buffers简介
什么是 protocol buffers ? Protocol buffers 是一种灵活.高效的序列化结构数据的自动机制--想想XML,但是它更小,更快,更简单.你只需要把你需要怎样结构化你的数据定 ...
- Google Protocol Buffers和java字符串处理控制
大多数的操作码被从夜晚复制.懒得敲. 直接在源代码和测试结果如下. serabuffer.proto档.使用下面的命令来生成java代码. protoc -I=./ --java_out=./ ser ...
- DELPHI、FLASH、AS3、FLEX使用Protobuf(google Protocol Buffers)的具体方法
最近因为工作需要,需要在不同的开发环境中应用Protobuf,特此,我专门研究了一下.为了防止自己忘记这些事情,现在记录在这里!需要的朋友可以借鉴一些,因为这些东西在GOOGLE和百度上搜索起来真的很 ...
- Google Protocol Buffers学习
参考资料:http://www.cnblogs.com/royenhome/archive/2010/10/29/1864860.html 参考资料:http://www.jianshu.com/p/ ...
- 阅读Google Protocol Buffers 指南,整理pb语法
官方网站: https://developers.google.com/protocol-buffers/docs/proto3 1.简单定义一个Message 类型 pb语法文件以"*.p ...
随机推荐
- Django与缓存
我们都知道Django建立的是动态网站,正常情况下,每次请求过来都经历了这样一个过程: 接收请求 -> url路由 -> 视图处理 -> 数据库读写 -> 视图处理 -> ...
- 启动node程序报错:event.js:183 throw er; // unhandled 'error' event
启动node程序时,报如下错误:
- python+kafka,从指定位置消费数据
# @staticmethoddef get_kafka_reviews(self): # print type(self.bootstrap_servers) consumer = kafka.Ka ...
- HeadFirst Ruby 第十五章总结 Saving and loading data
前言 在上一章讲述了如何进行基础的操作,比如 处理 GET 请求的 get route, 再比如下载 gem 等等方面的知识.在这一章节,作者告诉我们如何储存.处理数据.整个过程分三步走: 首先,当 ...
- spring cloud: zuul(四): 正则表达式匹配其他微服务(给其他微服务加版本号)
spring cloud: zuul(四): 正则表达式匹配其他微服务(给其他微服务加版本号) 比如我原来有,spring-boot-user微服务,后台进行迭代更新,另外其了一个微服务: sprin ...
- springboot---->java.lang.IllegalArgumentException
springboot aop编程时,在方法上加入通知的注解,添加织入路径测试,发生报错: java.lang.IllegalArgumentException: Pointcut is not wel ...
- 安卓音、视频播放功能简单实现 --Android基础
1.音乐播放功能 关键代码: MainActivity.java: package thonlon.example.cn.musicdemowithoutservice; import android ...
- yarn hadoop-2.3.0 installation cluster Centos 64bits
Apache Hadoop -2.2.0 - How to Install a Three Nodes Cluster http://tonylixu.blogspot.ca/2014/02/apac ...
- Lua常用封装方法
Lua 获取随机值 --获取随机值,指定上限和下限 function getRandom(min,max) -- 接收一个整数n作为随即序列的种子 math.randomseed(os.time()) ...
- vue.js如何实现点击按钮动态添加li
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...