Dec 15, 2010

protobuf 以及程序的配置文件,参数文件

boost 的 program options 可以读入程序的配置文件,但是不支持复杂的结构,也不支持二进制

Google protocol buffer
根据用户编写的可视化结构,生成 c++/python/java 类,实现可以串行化的数据结构。支持二进制和文本文件。

protobuf 支持三种数据,也就是 message 的成员变量

  • required 谨慎使用
  • optional
  • repeated

required 和 optional 具有相应的函数:
bool has_key()   required 也有这一个函数,可以判断是否已经赋值
const Key& key()  返回常引用,不能改变其值
clear_key()
修改函数为下面二者之一(string 类型数据两个都有)
set_key(Value)    对于简单类型
Key* mutable_key() 对于自定义类型以及 string

required 和 optional 都可以设置默认值,没有设置的话默认值为零/空
optional 域可以不赋值,但可以取其默认值
required 则也可以不赋值,但是会报错,不赋值也为默认值。
因此 optional 加默认值一般已经满足要求了,required 要慎重设置


repeated  个数>=0,具有
key_size()
clear_key()
const Key& key(index)
Key * mutable_key(index) 修改某一个
Key * add_key() 添加一个
以及

key()
mutable_key() 以上两个目前还不知道怎么用

串行化二进制接口
  • bool SerializeToString(string* output) const;: serializes the message and stores the bytes in the given string. Note that the bytes are binary, not text; we only use the string class as a convenient container.
  • bool ParseFromString(const string& data);: parses a message from the given string.
  • bool SerializeToOstream(ostream* output) const;: writes the message to the given C++ ostream.
  • bool ParseFromIstream(istream* input);: parses a message from the given C++ istream.

串行化必须先清空文件,再重新全部写入,不能递加(确认?)。因此串行化输出时,别忘了 ios::trunc
SerializePartialToOstream 类似于SerializeToOstream,但是接受没有赋值的 required

串行化文本格式
person {
  name: "kevin"
  id: 2
}
person {
  name: "jobs"
  id: 4
  phone {
    number: "139"
  }
}

串行化文本接口
std::fstream fstr_out("msg.txt", std::ios::out | std::ios::trunc);
google::protobuf::io::ZeroCopyOutputStream *zc_out = new google::protobuf::io::OstreamOutputStream(&fstr_out);
google::protobuf::TextFormat::Print(address_book, zc_out);
delete zc_out;


ifstream fstr_in("msg.txt");
gio::ZeroCopyInputStream *zc_in = new gio::IstreamInputStream(&fstr_in);
google::protobuf::TextFormat::Parse(zc_in, &address_book);
delete zc_in;

0 comments: