介绍下怎么反序列化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及Python环境安装

    大部分人在工作中可能是以c/c++.java之类的语言为主.这也可能是我们接触的第一个开发语言,这类语言一般有丰富地类库.高效地运行速率.灵活地组合控制,须要经过编译在运行.适用于大型的项目proje ...

  2. vue源码cached高阶函数解析

    1.源代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  3. hadoop的namenode无法启动的解决的方法

    安装hadoop集群时,启动集群,发现master节点的namenode没有启动成功.这一般都是没有格式格式化namenode的缘故.格式化一下就可以,格式化namenode的命令:在hadoop安装 ...

  4. 解决java.lang.OutOfMemoryError: unable to create new native thread问题

    解决:1.升级JVM到最新的版本 最新版本的JVM一般在内存优化方面做的更好,升级JVM到最新的版本可能会缓解测问题2.从操作系统层面去解决 使用64位操作系统 如果使用32位操作系统遇到unable ...

  5. 【协议篇】TCP

    TCP 百科名片 TCP:Transmission Control Protocol 传输控制协议TCP是一种面向连接(连接导向)的.可靠的.基于字节流的运输层(Transport layer)通信协 ...

  6. TOMCAT问题总结

      迁移时间--2017年7月9日14:58:12Author:Marydon CreateTime--2016年12月25日21:55:09Author:MarydonTomcat问题总结问题一 A ...

  7. 【TP3.2】跨库操作和跨域操作

    一.跨库操作:(同一服务器,不同的数据库) 假设UserModel对应的数据表在数据库user下面,而InfoModel对应的数据表在数据库info下面,那么我们只需要进行下面的设置即可. class ...

  8. mysql中内存的使用与分配

    mysql的内存分配,是调优的重中之重,所以必须搞清楚内存是怎么分配的 mysql> show global variables like '%buffer%'; +-------------- ...

  9. protobuf配置与使用

    Protobuf配置与安装 1 安装与配置 1.protobuf是google公司提出的数据存储格式,详细介绍可以参考:https://code.google.com/p/protobuf/ 2.下载 ...

  10. IntelliJ Idea解决Could not autowire. No beans of 'xxxx' type found的错误提示

    本文转自:http://blog.csdn.net/u012453843/article/details/54906905 1.问题描述 在Idea的spring工程里,经常会遇到Could not ...