gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:21:03 27 4
gpt4 key购买 nike

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

您会注意到,我首先认为使用的运算符(&<<)对输出产生了影响,但事实并非如此,我得到以下文本文件:

22 serialization::archive 7 9 [CRLF]
[CRLF]
Part 1 [CRLF]
11 [CRLF]
[CRLF]
Part 145 [CRLF]

22 serialization::archive 7 part 是一个标准的 Boost 序列化 header ,用于识别我猜测的存档类型。之后是我想删除的部分,即 9 – 经过一番追逐,我发现 9"\n\nPart1\n" 的长度字符串!

这是预期的行为还是有规避此输出的方法?在其他实际记录的情况下,没有明显使用其他此类“控制代码”、标记长度等。

添加一些调试输出会很有用,但由于上述调试字符串的长度可能不同(因为在其中一个分支上进行了大量重构),差异会产生一些误报。

任何想法将不胜感激,谢谢!

最佳答案

我怀疑这是可能的。

您在这里面临的问题是文本输出需要被解析 以进行反序列化。有两种主要的构造文本输出的方法,以便可以轻松地对其进行解析:

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

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

前一种方式(长度前缀字符串)效率更高,但人类可写性要差得多。

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

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

您可能想切换到 boost::xml_oarchive .

关于c++ - 提升序列化——避免字符串长度输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14848713/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com