Protocol Buffers のテキストフォーマット入出力
Protocol Buffers のデータをエディタで修正できるように,テキストフォーマットでの入出力を試してみました.
利用したバージョンは 2.0.1 です.
(補足) リビジョン32 で protoc コンパイラによるバイナリ形式データとテキスト形式データの変換がサポートされたそうです.
http://code.google.com/p/protobuf/source/detail?r=32
下記コードは,C++チュートリアル を元にしています.
#include <fstream> #include <iostream> #include <string> #include <google/protobuf/text_format.h> #include <google/protobuf/message.h> #include <google/protobuf/descriptor.h> #include <google/protobuf/io/zero_copy_stream.h> #include <google/protobuf/io/zero_copy_stream_impl.h> #include "addressbook.pb.h" using namespace std; using namespace google::protobuf; int main (int argc, char **argv) { GOOGLE_PROTOBUF_VERIFY_VERSION; tutorial::AddressBook address_book; PromptForAddress(address_book.add_person()); // データ作成 // Binary Output { fstream output("addressbook.bin", ios::out | ios::trunc | ios::binary); if (!address_book.SerializeToOstream(&output)) { cerr << "Failed to write address book." << endl; return -1; } } tutorial::AddressBook address_book2; // Binary Input { fstream input("addressbook.bin", ios::in | ios::binary); if (!address_book2.ParseFromIstream(&input)) { cerr << "Failed to parse address book." << endl; return -1; } } // Text Output { //fstream foutput("addressbook.txt", ios::out | ios::trunc | ios::binary); // 改行をどうするか fstream foutput("addressbook.txt", ios::out | ios::trunc); io::OstreamOutputStream* output = new io::OstreamOutputStream(&foutput); if (!TextFormat::Print(address_book, output)) { cerr << "Failed to write address book." << endl; return -1; } delete output; } tutorial::AddressBook address_book3; // Text Input { //fstream finput("addressbook.txt", ios::in | ios::binary); // 改行をどうするか fstream finput("addressbook.txt", ios::in); io::IstreamInputStream* input = new io::IstreamInputStream(&finput); TextFormat::Parser parser; if (!parser.Parse(input, &address_book3)) { cerr << "Failed to parse address book." << endl; return -1; } delete input; }