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 的使用和原理

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

Google Protocol Buffer安装及在python中的使用

安装 1. 下载protobuf源代码(当前最新版本为:2.5.0)  #cd /opt  #wget https://protobuf.googlecode.com/files/protobuf...
  • u010029983
  • u010029983
  • 2015年10月09日 11:27
  • 2780

Java中使用Protocol Buffer

一、Protocol Buffer简介 什么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的文字介绍: Google Protocol Buffer( 简...
  • yubo_725
  • yubo_725
  • 2016年08月16日 13:21
  • 2546

Google Protocol Buffer介绍

转自:http://www.usidcbbs.com/simple/?t5565.html 简介 什么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的...
  • yaonai2003
  • yaonai2003
  • 2014年02月20日 21:55
  • 11214

windows以及linux 环境下Google Protocol Buffer 下载编译安装教程

protobuf的全称是Protocol Buffer,它是google 的一种数据交换的格式,可用于用于分布式应用之间的数据通信或者异构环境下的数据交换。 /////////////////...
  • shaderdx
  • shaderdx
  • 2015年09月24日 16:13
  • 1700

【Google Protocol Buffers】Protocol Buffer基础:C++篇

注:这是本人的翻译,可能不准确,可能有错误,但是基本上可以理解,希望能对大家有所帮助!(转载请注明出处:本文来自learnhard的博客:http://www.codelast.com/ & http...
  • ghlfllz
  • ghlfllz
  • 2011年04月18日 21:13
  • 5082

Google Protocol buffer 系列二: 常用api

What Are Protocol Buffers? Protocol buffers are Google's language-neutral, platform-neutral, exten...
  • scut1135
  • scut1135
  • 2013年11月14日 23:16
  • 2206

快来看看Google出品的Protocol Buffer,别只会用Json和XML了

前言 习惯用 Json、XML 数据存储格式的你们,相信大多都没听过Protocol BufferProtocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存储格...
  • aptentity
  • aptentity
  • 2017年03月29日 23:20
  • 839

caffe源码学习(一) google protocol buffer

caffe源码学习 protocol buffer
  • u011104550
  • u011104550
  • 2016年04月24日 11:27
  • 1491

一个基于protocol buffer的RPC实现

一个基于protocol buffer的RPC实现 Protocol Buffer仅仅是提供了一套序列化和反序列化结构数据的机制,本身不具有RPC功能,但是可以基于其实现一套RP...
  • u010064842
  • u010064842
  • 2015年04月15日 22:52
  • 1333
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:google protocol buffer的原理和使用(三)
举报原因:
原因补充:

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