假设你的protobuf
message
长这样:
message Object
{
... = 1;
... = 2;
... = 3;
}
然后在同一个文件中,引入另外一个message
,其中包含这些Object
的集合。
message Objects
{
repeated Object array = 1
}
因此,当您有许多元素时,可以简单地使用
对象
并在
对象
上使用
SerializeAsString()
。这将节省您序列化单个
对象
并放置自己手动制作的分隔符的工作量。您可以使用单个
对象
的实例序列化所有的
对象
。
通过这种方法,您还可以将所有解析和序列化工作委托给 Protobuf 库。我在我的项目中使用了这种方法,它的效果非常好。
此外,明智地使用
对象
也可以避免创建额外的
对象
副本。您可以向其中添加项目并使用索引访问。Protobufs 的
repeated
字段符合 C++11 标准,因此您也可以使用迭代器或增强的
for
循环进行操作。
需要注意的是,在将
Objects::SerializeAsString()
的输出存储到文件中时,应该首先输入该字符串的长度,然后才是实际序列化的字符串。在读取时,您可以先读取长度,然后是总字节数。为了方便使用,我扩展了
std::fstream
并重载了以下方法:
struct fstreamEncoded : std::fstream
{
void
operator<< (const string& content)
{
static_cast<std::fstream&>(*this) << (content.length() + 1) << "\n" << content << std::endl;
}
string
getline ()
{
char length_[20] = {};
std::istream::getline(length_, sizeof(length_) - 1);
if(*length_ == 0)
return "";
const size_t length = std::atol(length_);
string content(length, 0);
read(&content[0], length);
return content;
}
}
上面只是一个示例。您可以根据项目需求进行操作。