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 thestring
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:
Post a Comment