我正在序列化一些来自项目的两个不同分支的数据。使用boost::serialization
以文本存档形式输出数据。由于在两个序列化文件之间要进行差异,我还要在每个序列化部分之间的序列化文件中添加一些调试消息,以便更好地看到输出可能出现差异的点。
以下是我目前正在使用的代码的概述:
std::ofstream ofs("./SomeFile.txt"); // for brevity's sake, no actual path used
{
boost::archive::text_oarchive oa(ofs);
std::string debug_str;
debug_str = "\n\nPart 1\n";
oa & debug_str;
// ... some other serialized parts ...
debug_str = "\n\nPart 145\n";
oa << debug_str;
}
您可以注意到我首先认为使用的运算符(&
vs <<
)在输出方面有所不同,但它没有,我得到以下文本文件:
22 serialization::archive 7 9 [CRLF]
[CRLF]
Part 1 [CRLF]
11 [CRLF]
[CRLF]
Part 145 [CRLF]
22 serialization::archive 7
部分是标准的Boost序列化标题,用于标识我猜的存档类型。之后是我希望删除的部分,即9
- 经过一些鹅追逐后,我发现9
是"\n\nPart1\n"
字符串的长度!
这是预期的行为还是有办法绕过这个输出?在其他实际记录的情况下,没有明显使用其他这样的“控制代码”,标记长度等。
添加一些调试输出会很有用,但由于所述调试字符串的长度可能不同(因为在其中一个分支上发生了大量重构),diff会产生一些误报。
任何想法都会受到赞赏,谢谢!
答案 0 :(得分:2)
我怀疑这是可能的。
您在这里遇到的问题是文本输出需要解析才能反序列化。构造文本输出有两种主要方式,因此可以轻松解析:
例如,在xml存档中,代码被<
和>
包围,您不能自己使用这些字符,而是分别使用转义代码<
和>
。另一方面,如果您查看Redis格式,您将看到13$Hello, World!
之类的内容,其中记录的长度是一串数字,后跟$,后跟实际记录。
前一种方式(长度为前缀的字符串)效率更高,但人类可写得更少。
从Boost :: Serialization文档中,我看到两个不同的“人类可读”档案:
boost::text_[i/o]archive
使用长度前缀字符串(似乎)boost::xml_[i/o]archive
使用xml表示您可能想切换到boost::xml_oarchive
。