乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      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)似文章 更多