google protocol buffer的原理和使用(三)

原创 2015年07月10日 10:10:24
介绍下怎么反序列化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的原理和使用(四)

有个电子商务的系统(假设用C++实现),其中的模块A需要发送大量的订单信息给模块B,通讯的方式使用socket。 假设订单包括如下属性: -----------------------------...

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

简介: Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、...

Google protocol buffer文件的原理和使用

在此学习.protoc文件,在网上有一篇博文写的很好,转了下: 原文地址:http://blog.csdn.net/majianfei1023/article/details/4511241...

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

本文主要会介绍怎么使用Google Protocol的Lib来序列化我们的数据,方法很多种,本文只介绍其中的三种,其他的方法读者可以通过自行研究摸索。但总的来说,序列化数据总的来说分为以下俩步:   ...

Google Protocol Buffer 的使用和原理

很详细的关于protobuff的介绍,先收藏之! 简介什么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的文字介绍:Google Protocol Buffe...

Google Protocol Buffer的使用和原理

么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的文字介绍: Google Protocol Buffer( 简称 Protobuf) 是 Google...

Google protocol buffer 使用和原理浅析 And 进阶使用方式之PbCodec

Google Protocol Buffer又简称Protobuf,它是一种很高效的结构化数据存储格式,一般用于结构化数据的串行化,简单说就是我们常说的数据序列化。这种序列化的协议非常轻便高效,而且是...

Google Protocol Buffer原理

GoogleProtocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 ....

Google Protocol Buffer(GPB)使用之完全解析二:有了GPB的日子怎么过?什么是GPB?

通过前面博文的学习,我们知道:没有GPB,客户端的日子很难过,现在略作回顾,没有GPB的日子是这样的:  #include #include using namespace std; int ...
  • stpeace
  • stpeace
  • 2013年06月23日 13:45
  • 2848

在python中使用google protocol buffer

今天想要写个python脚本来把我们之前一个项目中使用的gpb格式导出的数据打印出来,由于之前接触python很少,所以基本是从头学起 基本的语法的话我就不说了,我主要记录一下我的几个环境配置 p...
  • kerlw
  • kerlw
  • 2011年05月20日 12:36
  • 3495
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:google protocol buffer的原理和使用(三)
举报原因:
原因补充:

(最多只允许输入30个字)