介绍下怎么反序列化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. Eclipse里如何配制项目在tomcat中启动

    首先,在Eclipse中新建一个Hello工程,Workspace的位置在c:/eclipse/workspace,所以hello工程的位置就是在%Workspace%/hello/这个文件夹中.  ...

  2. wepy - 入手

    wepy官方文档: https://tencent.github.io/wepy/document.html#/ ESLint:一般用来校验JavaScript代码是否符合规范,不符合预期就报错(程序 ...

  3. Phpcms没有找到网址列表

    今天在搞phpcms的采集遇到了这个问题. 没有找到网址列表,请先进行网址采集. 百度,google了好久: 网上答案: 方案1 1.尝试清除 v9_collection_history 表里的内容 ...

  4. inode备忘

    文件名 -> inode -> device block 转自:http://www.cnblogs.com/itech/archive/2012/05/15/2502284.html 一 ...

  5. plsql oracle client没有正确安装(plsql连接远程数据库)

      plsql oracle client没有正确安装(plsql连接远程数据库) CreateTime--2018年4月23日16:55:11 Author:Marydon 1.情景再现 2.问题解 ...

  6. maven POM.xml内的标签大全详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  7. java SequenceInputStream类(序列输入流)的用法示例

    public class SequenceInputStreamextends InputStream SequenceInputStream 表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从 ...

  8. Tomcat訪问日志浅析

    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" ...

  9. 【cookie】cookie和session的终极区别

    如果浏览器使用的是 cookie,那么所有的数据都保存在浏览器端,比如你登录以后,服务器设置了 cookie用户名(username),那么,当你再次请求服务器的时候,浏览器会将username一块发 ...

  10. js 随机变换图片

    <div style="position:absolute;left:40%;top:10%;border-style:dotted"> <img src=&qu ...