青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

在C++中使用Google的“Protocol Buffers”

如果您已經初步了解了Protocol Buffers并打算試著使用它,本文符合您的胃口。如果您剛聽說Protocol Buffers,請先到本文末尾的附錄區看一看。

1.下載并安裝Protocol Buffers

可以從官方下載源碼包,linux下和Solaris下的安裝直接見源碼包中的“README.txt”。這里詳細說下Windows下的安裝,源碼包里有一個“vsprojects”目錄,其中就是vs的工程文件和解決方案。用vs(版本得高點)打開“protobuf.sln”解決方案,編譯。其中包括四個工程 libprotobuf(接口dll庫)、libprotoc(轉換器的實現庫)、protocwindows下轉換器的實現)、tests(使用gTest庫進行的測試)。編譯好之后在Debug目錄下可以找到“libprotobuf.dlllibprotobuf.lib”,這個是我們的程序要使用的動態鏈接庫和導入庫。“libprotoc.dlllibprotoc.lib”,這個是完成.proto文件到cppjavapython格式數據轉換的庫。“protoc.exe”,這個是windows下轉換程序(它使用了剛才的libprotoc),這個程序的靜態鏈接版本也在此項目老家提供下載。

2.設置編譯環境

    linux下,只要將Protocol Buffers源碼包安裝到系統即可開始使用。而windows下需要設置一下編譯環境,將“src”目錄加入到編譯器的頭文件搜索路徑,將“vsprojects\Debug”目錄加入到編譯器的lib搜索路徑中。為了更方便的在windows命令行下使用protoc.exe轉換程序,可以將“vsprojects\Debug”目錄添加到系統PATH變量中。

3.編寫.proto數據描述文件

    這里仿照源碼中例子,寫出“addressbook.proto”文件。內容如下:

--code begin--

package tutorial;

 

message Person {

  required string name = 1;

  required int32 id = 2;

  optional string email = 3;

 

  enum PhoneType {

    MOBILE = 0;

    HOME = 1;

    WORK = 2;

  }

 

  message PhoneNumber {

    required string number = 1;

    optional PhoneType type = 2 [default = HOME];

  }

 

  repeated PhoneNumber phone = 4;

}

 

message AddressBook {

  repeated Person person = 1;

}

--code end--

4.使用protoc(windows下是protoc.exe)生成c++頭文件及類文件。

    protoc.exe --cpp_out=./ addressbook.proto

如果沒有錯誤,程序將沒有任何輸出。并且當前目錄下多出兩個文件“addressbook.pb.h”“addressbook.pb.cc”

5.編寫C++程序使用它們

    新建vs工程,除了設置以上的頭文件搜索路徑和庫文件搜索路徑外,還要鏈接到庫“libprotobuf.lib”。將4步生成的一個.h文件和一個.cpp文件添加并拷貝到工程里,由于vs的特性(需要預編譯頭),所以在addressbook.pb.cc開頭添加“#include "stdafx.h"”,主代碼如下,然后編譯。這個演示程序需要一個參數用于指定數據文件文件名,第一次運行,會生成這個數據文件。它會先讓用戶輸入一條通訊錄信息并添加進數據文件,然后再顯示出指定的數據文件中所有的數據。注意,為了使DEMO程序可以運行,別忘了拷貝“vsprojects\Debug”目錄下的動態鏈接庫“libprotobuf.dll”到當前目錄。

--code begin--

// testprotocolbuffer.cpp : 定義控制臺應用程序的入口點。

//

 

#include "stdafx.h"

 

// See README.txt for information and build instructions.

 

#include <iostream>

#include <fstream>

#include <string>

#include "addressbook.pb.h"

 

using namespace std;

 

// This function fills in a Person message based on user input.

void PromptForAddress(tutorial::Person* person) {

  cout << "Enter person ID number: ";

  int id;

  cin >> id;

  person->set_id(id);

  cin.ignore(256, '\n');

 

  cout << "Enter name: ";

  getline(cin, *person->mutable_name());

 

  cout << "Enter email address (blank for none): ";

  string email;

  getline(cin, email);

  if (!email.empty()) {

    person->set_email(email);

  }

 

  while (true) {

    cout << "Enter a phone number (or leave blank to finish): ";

    string number;

    getline(cin, number);

    if (number.empty()) {

      break;

    }

 

    tutorial::Person::PhoneNumber* phone_number = person->add_phone();

    phone_number->set_number(number);

 

    cout << "Is this a mobile, home, or work phone? ";

    string type;

    getline(cin, type);

    if (type == "mobile") {

      phone_number->set_type(tutorial::Person::MOBILE);

    } else if (type == "home") {

      phone_number->set_type(tutorial::Person::HOME);

    } else if (type == "work") {

      phone_number->set_type(tutorial::Person::WORK);

    } else {

      cout << "Unknown phone type.  Using default." << endl;

    }

  }

}

 

// Iterates though all people in the AddressBook and prints info about them.

void ListPeople(const tutorial::AddressBook& address_book) {

  for (int i = 0; i < address_book.person_size(); i++) {

    const tutorial::Person& person = address_book.person(i);

 

    cout << "Person ID: " << person.id() << endl;

    cout << "  Name: " << person.name() << endl;

    if (person.has_email()) {

      cout << "  E-mail address: " << person.email() << endl;

    }

 

    for (int j = 0; j < person.phone_size(); j++) {

      const tutorial::Person::PhoneNumber& phone_number = person.phone(j);

 

      switch (phone_number.type()) {

        case tutorial::Person::MOBILE:

          cout << "  Mobile phone #: ";

          break;

        case tutorial::Person::HOME:

          cout << "  Home phone #: ";

          break;

        case tutorial::Person::WORK:

          cout << "  Work phone #: ";

          break;

      }

      cout << phone_number.number() << endl;

    }

  }

}

 

// Main function:  Reads the entire address book from a file,

//   adds one person based on user input, then writes it back out to the same

//   file.

int main(int argc, char* argv[]) {

  // Verify that the version of the library that we linked against is

  // compatible with the version of the headers we compiled against.

  GOOGLE_PROTOBUF_VERIFY_VERSION;

 

  if (argc != 2) {

    cerr << "使用方法:  " << argv[0] << " 想要生成的存儲數據的文件" << endl;

    return -1;

  }

 

  tutorial::AddressBook address_book;

 

  {

    // Read the existing address book.

    fstream input(argv[1], ios::in | ios::binary);

    if (!input) {

      cout << argv[1] << ": 指定的文件沒找到,創建一個新文件." << endl;

    } else if (!address_book.ParseFromIstream(&input)) {

      cerr << "解析addressbook數據文件失敗。" << endl;

      return -1;

    }

  }

 

  // Add an address.

  PromptForAddress(address_book.add_person());

 

  {

    // Write the new address book back to disk.

    fstream output(argv[1], ios::out | ios::trunc | ios::binary);

    if (!address_book.SerializeToOstream(&output)) {

      cerr << "寫入文件失敗。" << endl;

      return -1;

    }

  }

 

  //再從文件中讀取剛才那個數據

  tutorial::AddressBook address_book2;

 

  {

    // Read the existing address book.

    fstream input(argv[1], ios::in | ios::binary);

    if (!address_book2.ParseFromIstream(&input)) {

      cerr << "解析文件失敗。" << endl;

      return -1;

    }

  }

 

  ListPeople(address_book2);

 

  return 0;

}

--code end--

運行方式和結果如下圖:

clip_image001

備注:寫這東西好累啊。。。

=====================附錄====================

1.Protocol BuffersGoogle自己的一種數據交換格式。其簡介可以參考文章谷歌發布內部數據語言 比XML快近100

2.如果想要了解Protocol Buffers相關的詳細信息,請訪問它的老家Protocol Buffers

 

posted on 2009-08-20 23:58 肥仔 閱讀(3566) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            模特精品在线| 亚洲国产精品传媒在线观看| 99国产麻豆精品| 欧美女同视频| 亚洲图片欧美一区| 亚洲一区中文字幕在线观看| 国产日韩av在线播放| 久久久久久久综合日本| 久久噜噜噜精品国产亚洲综合| 一区福利视频| 亚洲人成在线观看一区二区| 欧美色视频一区| 久久精品国产69国产精品亚洲| 久久高清免费观看| 亚洲精品国产视频| 99精品国产在热久久婷婷| 国产嫩草影院久久久久| 欧美福利在线| 国产精品扒开腿做爽爽爽软件| 午夜精品久久久久久久久| 久久精品国产免费观看| 亚洲欧洲一区二区天堂久久| 一本色道久久88综合日韩精品| 国产欧美日韩免费| 亚洲国产欧美在线| 国产精品你懂的| 亚洲电影av| 国产美女精品在线| 91久久精品网| 激情久久久久久久久久久久久久久久| 亚洲第一狼人社区| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 欧美激情精品久久久久久大尺度| 欧美日韩国产另类不卡| 久久夜色精品国产欧美乱| 欧美精彩视频一区二区三区| 久久精品日韩| 国产精品白丝黑袜喷水久久久| 两个人的视频www国产精品| 欧美美女日韩| 欧美高清视频www夜色资源网| 国产精品久久久久久av福利软件| 嫩草影视亚洲| 国产一区二区三区高清在线观看 | 宅男噜噜噜66一区二区| 久久国产直播| 欧美伊久线香蕉线新在线| 欧美久色视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品久久久久久久久借妻 | 欧美夜福利tv在线| 欧美伦理视频网站| 欧美激情中文字幕一区二区| 国产亚洲aⅴaaaaaa毛片| 亚洲少妇在线| 亚洲一区二区在线| 欧美日韩99| 亚洲精品国产精品乱码不99按摩| 精品电影一区| 久久久久久久网| 老司机午夜精品视频| 国产日韩一区二区三区在线播放| 亚洲视频在线观看三级| 99re在线精品| 欧美日韩精品一二三区| 亚洲精品三级| 亚洲先锋成人| 国产精品日韩欧美综合| 亚洲一区二区在线| 欧美在线你懂的| 国色天香一区二区| 久久天天躁狠狠躁夜夜爽蜜月| 麻豆久久婷婷| 亚洲国产高清自拍| 欧美黑人多人双交| 亚洲久久一区| 亚洲综合视频网| 国产精品推荐精品| 性一交一乱一区二区洋洋av| 久久久www成人免费毛片麻豆| 国产精品资源在线观看| 欧美在线免费观看| 欧美国产亚洲视频| 一区二区日韩伦理片| 国产精品成人免费视频 | 亚洲欧洲精品天堂一级| 一本久久青青| 国产欧美一级| 美女诱惑一区| 一本色道久久综合亚洲精品不| 亚洲免费中文字幕| 黑人一区二区三区四区五区| 麻豆精品视频在线| 99在线精品观看| 久久久久成人精品| 亚洲三级视频| 国产农村妇女毛片精品久久莱园子| 欧美一区久久| 亚洲精品久久久久久久久久久久| 午夜精品视频| 最近中文字幕日韩精品| 国产精品久久一区主播| 巨乳诱惑日韩免费av| 一本一本大道香蕉久在线精品| 久久久久久电影| 亚洲少妇最新在线视频| 国产在线高清精品| 欧美日韩亚洲综合一区| 久久久久九九九| 国产精品99久久久久久有的能看| 麻豆9191精品国产| 亚洲欧美日韩中文播放| 91久久线看在观草草青青| 国产精品一区二区久久国产| 欧美a级片网站| 久久国产精品久久久久久久久久 | 亚洲免费一级电影| 亚洲肉体裸体xxxx137| 久久精品视频99| 亚洲一区视频在线观看视频| 亚洲成人在线视频播放| 国产手机视频精品| 国产精品久久久久久久久久久久| 免费永久网站黄欧美| 欧美专区福利在线| 亚洲视频在线观看网站| 亚洲毛片视频| 亚洲激情视频网| 欧美福利一区| 免费观看成人| 免费成人你懂的| 欧美中文在线视频| 香蕉尹人综合在线观看| 亚洲一区二区精品在线| 一区二区三区四区蜜桃| 亚洲精品久久久久久久久久久久久 | 亚洲国产三级网| 欧美成人中文字幕在线| 噜噜噜在线观看免费视频日韩| 久久精品国产亚洲aⅴ| 欧美一二三区在线观看| 亚洲欧美影院| 欧美一区二区三区电影在线观看| 亚洲影院免费| 亚洲一区二区三区四区视频 | 国产在线欧美日韩| 国产亚洲毛片| 韩日成人在线| 精品99一区二区三区| 亚洲第一区在线观看| 亚洲二区在线视频| 亚洲欧洲一区二区三区| 亚洲免费观看高清完整版在线观看熊| 亚洲国产成人精品久久| 亚洲激情视频网站| 一本色道久久综合一区| 一本久久a久久免费精品不卡| 一本色道婷婷久久欧美| 亚洲免费伊人电影在线观看av| 欧美一二区视频| 美脚丝袜一区二区三区在线观看 | 91久久在线播放| 99热免费精品| 亚洲欧美一区二区精品久久久| 亚洲欧美综合一区| 久久精品一二三区| 欧美精品久久一区二区| 欧美午夜宅男影院在线观看| 国产精品一区二区久久| 在线成人激情黄色| 一区二区免费在线视频| 久久激情久久| 亚洲国产成人精品久久久国产成人一区| 亚洲黄色片网站| 亚洲中字黄色| 欧美岛国激情| 国产女优一区| 亚洲每日更新| 久久国产99| 亚洲人成绝费网站色www| 亚洲视频大全| 免费看av成人| 国产美女精品视频免费观看| 亚洲国产欧美另类丝袜| 午夜在线精品偷拍| 亚洲国产一区二区a毛片| 午夜精品久久久久久久| 美女网站在线免费欧美精品| 国产精品麻豆成人av电影艾秋| 在线免费观看成人网| 先锋影音国产精品| 欧美激情一区二区三区在线视频观看| 亚洲少妇最新在线视频| 久久在精品线影院精品国产| 国产精品视频内| 亚洲小视频在线| 欧美激情在线狂野欧美精品| 欧美亚洲一区二区在线| 欧美网站大全在线观看| 亚洲精品人人|