日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Google Protocol Buffers淺析(四)

 feng0926 2013-08-06

     本文作為結(jié)束篇,會(huì)稍微介紹下怎么反序列化GoogleBuffer數(shù)據(jù),并在最后提供本系列文章中所用到的代碼整理供下載。

     上一篇文章介紹了怎樣將數(shù)據(jù)序列化到了addressbook.data中,那么對(duì)于接受方而言該怎么解析出原本的數(shù)據(jù)呢。同樣,protoc編譯器生成的代碼文件中提供了反序列化的接口,基本上和序列化的函數(shù)對(duì)應(yīng)的,如下圖所示:

       

      上文中采用了SerializeToOstream、SerializeToString、SerializeToCodedStream來(lái)序列化數(shù)據(jù)的,反序列化反其道行之即可。本文反序列化采用ParseFromArray方式,從某個(gè)角度算是對(duì)上文的一個(gè)補(bǔ)充吧!

       反序列化也是分為兩個(gè)步驟:

       1)將數(shù)據(jù)載入內(nèi)存或者輸入流 

       2)調(diào)用庫(kù)提供的反序列化接口函數(shù)進(jìn)行反序列化

      

       一、將數(shù)據(jù)載入 

       將數(shù)據(jù)從文件中讀出時(shí)候,需要注意以二進(jìn)制的模式打開(kāi),且編碼格式要指定正確,如下所示:               

復(fù)制代碼
    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;
    }
復(fù)制代碼

              

       二、反序列化

       上述代碼將addressbook.data中的數(shù)據(jù)載入了buffer中,接著我們就可以將其作為參數(shù)傳給ParseFromArray來(lái)反序列化,并格式化輸出到控制臺(tái),如下:     

復(fù)制代碼
    AddressBook    addressBook;
    addressBook.par
    addressBook.Clear();

    
if!addressBook.ParseFromArray(buffer,lfilesize) )
    {
        cerr
<<"Deserial from addressbook.data failed!\n";
        
return;
    }

    
int personSize = addressBook.person_size();

    
forint 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();
        
forint 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;
    }
復(fù)制代碼

         運(yùn)行結(jié)果如下所示:

         

         好了,相信通過(guò)本系列文章,讀者應(yīng)該對(duì)Google Protocol Buffer有一定的認(rèn)識(shí)了吧。當(dāng)然,想要更深入的了解,還是參考Google的官方在線文檔吧!

         示例代碼下載地址:SerialProtocolBuffer示例代碼


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多