本文作為結(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),且編碼格式要指定正確,如下所示: 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中的數(shù)據(jù)載入了buffer中,接著我們就可以將其作為參數(shù)傳給ParseFromArray來(lái)反序列化,并格式化輸出到控制臺(tái),如下: 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; } 運(yùn)行結(jié)果如下所示: 好了,相信通過(guò)本系列文章,讀者應(yīng)該對(duì)Google Protocol Buffer有一定的認(rèn)識(shí)了吧。當(dāng)然,想要更深入的了解,還是參考Google的官方在線文檔吧! 示例代碼下載地址:SerialProtocolBuffer示例代碼 |
|
來(lái)自: feng0926 > 《我的圖書(shū)館》