提升序列化 - 避免字符串长度输出?

时间:2013-02-13 07:47:27

标签: c++ boost-serialization

我正在序列化一些来自项目的两个不同分支的数据。使用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会产生一些误报。

任何想法都会受到赞赏,谢谢!

1 个答案:

答案 0 :(得分:2)

我怀疑这是可能的。

您在这里遇到的问题是文本输出需要解析才能反序列化。构造文本输出有两种主要方式,因此可以轻松解析:

  • 长度为前缀的字符串
  • 特殊字符(带转义码)

例如,在xml存档中,代码被<>包围,您不能自己使用这些字符,而是分别使用转义代码&lt;&gt; 。另一方面,如果您查看Redis格式,您将看到13$Hello, World!之类的内容,其中记录的长度是一串数字,后跟$,后跟实际记录。

前一种方式(长度为前缀的字符串)效率更高,但人类可写得更少。

从Boost :: Serialization文档中,我看到两个不同的“人类可读”档案:

  • boost::text_[i/o]archive使用长度前缀字符串(似乎)
  • boost::xml_[i/o]archive使用xml表示

您可能想切换到boost::xml_oarchive