介绍下怎么反序列化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. 自定义cas客户端核心过滤器AuthenticationFilter

    关于cas客户端的基本配置这里就不多说了,不清楚的可以参考上一篇博文:配置简单cas客户端.这里是关于cas客户端实现动态配置认证需要开发说明. 往往业务系统中有些模块或功能是可以不需要登录就可以访问 ...

  2. MVC4.0网站发布

    一.VS2010下MVC4.0项目的发布 首先,生成网站发布文件. 第一步,"右击"要发布的MVC4.0项目,选择"发布(B)..."选项,如图: 第二步,在& ...

  3. ibatis 批量更新(一)

      1.4.2.3 批量修改 支持单个动态更新.批量动态更新 <update id="updateCONSULT_SCHEDULEDynamic" parameterClas ...

  4. 简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Wen. ...

  5. yml在线格式转换工具(properties)

    分享一个在线properties 转 yml工具,也支持yml转properties, 域名非常简单好记,直接在地址栏里输入toyaml.com,地址:http://toyaml.com/ yml,即 ...

  6. 各种HTTPS站点的SSL证书 ,扩展SSL证书,密钥交换和身份验证机制汇总

    各种HTTPS站点的SSL证书 ,扩展SSL证书,密钥交换和身份验证机制汇总 一份常见的 HTTPS 站点使用的证书和数据加密技术列表,便于需要时比较参考,将持续加入新的 HTTP 站点,这里给出的信 ...

  7. STL容器 erase的使用陷井

    http://www.cppblog.com/beautykingdom/archive/2008/07/09/55760.aspx?opt=admin 在STL(标准模板库)中经常会碰到要删除容器中 ...

  8. 列表生成式&生成器表达式

    一.列表生成式 def func(): return [lambda x:i*x for i in range(4)] print([j(2) for j in func()]) 结果:[6,6,6, ...

  9. HDUOJ---1171

    http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Java/Othe ...

  10. evernote如何笔记共享

    首先将你的笔记共享     访问你的共享笔记地址,就可看到共享笔记的内容了 https://www.evernote.com/pub/用户名/笔记名 https://www.evernote.com/ ...