由于在protobuf论坛上发过相关问题,但,根据https://developers.google.com/protocol-buffers/docs/techniques提供的相关解决办法,自己测试下想再反馈给论坛,下面是测试过的,当想放到论坛时,好像那个问题已经关闭了。

其实和自定义一种数据结构没什么区别。

proto file中的定义是:

enum FileAction {
FILE_ACTION_ADD = 3;
FILE_ACTION_DEL = 2;
FILE_ACTION_MODIFY = 1;
FILE_ACTION_RENAME = 0;
}

message FileState {
required string name = 1; // file name
required FileAction state = 2; // file state
}

#include"GFileState.pb.h"#include<fstream>#include<string>#include<iostream>usingstd::string;usingstd::fstream;usingstd::cout;intmain(intargc,char*argv[]){stringfPath("message.txt");stringstrMsg;charbuf[1024]={0};fstreamf;intsize;f.open(fPath.c_str(),std::ios_base::app|std::ios_base::binary);FileStatemsg,msg2;msg.set_name("D:\\Test1");msg.set_state(FILE_ACTION_ADD);msg.SerializeToString(&strMsg);//msg.SerializePartialToString(&strMsg);size=strMsg.length();f.write((char*)&size,sizeof(size));f.write(strMsg.c_str(),size);f.seekg(std::ios_base::end);msg.set_name("/usr/home/nc/download");msg.set_state(FILE_ACTION_MODIFY);msg.SerializeToString(&strMsg);size=strMsg.length();f.write((char*)&size,sizeof(size));f.write(strMsg.c_str(),size);f.close();f.open(fPath.c_str(),std::ios_base::in|std::ios_base::binary);f.seekg(std::ios_base::beg);strMsg.clear();size=0;while(!f.eof()){f.read((char*)&size,sizeof(size));if(size>0&&size<sizeof(buf)){f.read(buf,size);msg.ParseFromString(buf);cout<<"name:\t\t"<<msg.name()<<std::endl;cout<<"state:\t\t"<<static_cast<int>(msg.state())<<std::endl;}msg.Clear();memset(buf,'\0',sizeof(buf));size=0;}f.close();std::cin>>strMsg;return0;}