介绍下怎么反序列化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的原理和使用(三)的更多相关文章

  1. google protocol buffer的原理和使用(二)

    本文主要会介绍怎么使用Google Protocol的Lib来序列化我们的数据,方法非常多种,本文仅仅介绍当中的三种.其它的方法读者能够通过自行研究摸索.但总的来说,序列化数据总的来说分为下面俩步: ...

  2. google protocol buffer的原理和使用(一)

    一.简单的介绍      Protocol buffers是一个用来序列化结构化数据的技术,支持多种语言诸如C++.Java以及Python语言.能够使用该技术来持久化数据或者序列化成网络传输的数据. ...

  3. google protocol buffer的原理和使用(四)

    有个电子商务的系统(如果用C++实现).当中的模块A须要发送大量的订单信息给模块B.通讯的方式使用socket. 如果订单包含例如以下属性: ----------------------------- ...

  4. Google Protocol Buffer 的使用和原理

    Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...

  5. 转Google Protocol Buffer 的使用和原理

    Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它 ...

  6. Google Protocol Buffer 的使用和原理[转]

    本文转自: http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构 ...

  7. Google Protocol Buffer 的使用和原理(无论对存储还是数据交换,都是个挺有用的东西,有9张图做说明,十分清楚)

    感觉Google Protocol Buffer无论对存储还是数据交换,都是个挺有用的东西,这里记录下,以后应该用得着.下文转自: http://www.ibm.com/developerworks/ ...

  8. (转)Google Protocol Buffer 的使用和原理

    转自:https://www.ibm.com/developerworks/cn/linux/l-cn-gpb/index.html   简介 什么是 Google Protocol Buffer? ...

  9. 【Google Protocol Buffer】Google Protocol Buffer

    http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Google Protocol Buffer 的使用和原理 Protocol Buffers ...

随机推荐

  1. Python网络爬虫 - 下载图片

    下载博客园的logo from urllib.request import urlretrieve from urllib.request import urlopen from bs4 import ...

  2. VC操作MPP文件

    1.背景简介 因需要对Office系列进行程序操作,特需要使用COM编程. Microsoft Project生成进度计划,office家族软件,文件后缀为.mpp. 具体信息见维基百科http:// ...

  3. 关于gcc、glibc和binutils模块之间的关系,以及在现有系统上如何升级的总结

    http://blog.csai.cn/user1/265/archives/2005/2465.html 一.关于gcc.glibc和binutils模块之间的关系 1.gcc(gnu collec ...

  4. sql数据库表复制、查看是否锁表

    1.不同数据库之间复制表的数据的方法: 当表目标表存在时: insert into 目的数据库..表 select * from 源数据库..表 当目标表不存在时: select * into 目的数 ...

  5. Eclipse——工作台

    Workspace 磁盘区域.存放工作资料

  6. 监测CentOS下TCP断线

    TCP正常的断开,通信双方(服务端和客户端)都是能知道的.但是非正常的断开,比如直接拔掉了网线,就只能靠如下两种方法,实现短时间内的检测. 一.心跳包机制 心跳包机制,是网游设计中的常用机制.从用户层 ...

  7. eclipse Java注释修改

      eclipse Java注释修改 CreationTime--2018年6月1日09点15分 Author:Marydon 1.自定义java类自动生成注释的类型 window-->perf ...

  8. xtraTabbedMdiManager的标题上右鍵弹出关闭窗体菜单

    实现一个增值功能, 在xtraTabbedMdiManager组件TabPage标题上右鍵弹出关闭当前窗体的菜单. C# Code: private void xtraTabbedMdiManager ...

  9. HttpClient中的Timout

    connection timeout和SoTimeout A connection timeout occurs only upon starting the TCP connection. This ...

  10. firefox 前端开发插件

    http://blog.csdn.net/xjinza/article/details/6856249