如何将 boost::iarchive 的流设置为空流

Posted

技术标签:

【中文标题】如何将 boost::iarchive 的流设置为空流【英文标题】:how could set boost::iarchive's stream to empty stream 【发布时间】:2014-02-19 08:32:25 【问题描述】:

为什么boost::iarchive 构造函数需要正确的字符串缓冲区? 我试图通过空流初始化,然后填充缓冲区和反序列化数据。 但是发生了构造函数错误。

可以考虑在有正确缓冲区时定义存档,但我需要由类成员变量定义。 因为用户有几种寄存器类型。

#include <stdio.h>
#include <stdlib.h>
#include <sstream>
#include <boost/archive/text_iarchive.hpp>

int main()

    std::istringstream iss ;
    boost::archive::text_iarchive iarchive(iss) ;
    return 0 ;

此代码是错误示例

【问题讨论】:

【参考方案1】:

通过简要查看 Boost 源代码,似乎在存档类的构造函数中,它们尝试从流的开头读取以验证它是否包含正确的内容。例如,文本存档数据可能以

开头
22 serialization::archive

而 xml 存档数据以

开头
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="10">

此内容预计会存在,并在构建时由存档实例读取以验证流。应用程序写入的数据(以及您的应用程序想要读取的数据)将跟随此标头数据。

这可以解释为什么当您使用空流构造 text_iarchive 实例时您的应用程序会失败。

我可以建议解决您的问题的一个解决方案是延迟创建存档对象,直到有效的数据流可用。如果归档对象必须是类成员,最简单的方法是将其声明为指针类型(可能是std::unique_ptr&lt;boost::archive::text_iarchive&gt;),以便在您需要它之前它最初可以为空(否则在堆栈中创建它一个函数并在需要时调用它)。

【讨论】:

【参考方案2】:

问题已解决。 存档必须类成员是因为注册了几种类型。所以制作指针也不是解决方案。 所以我徘徊了很长时间,我发现有注册类型的宏,所以不必访问存档对象。 所以我使用它,我解决了问题。

感谢回答。

【讨论】:

以上是关于如何将 boost::iarchive 的流设置为空流的主要内容,如果未能解决你的问题,请参考以下文章

如何将记录拆分为不同的流,从一个主题到不同的流?

如何使用不同类型的流减少?

bqplot可视化中的流数据

如何控制多个 Rss 文件的流

如何使用提议/答案交换来自两个对等连接的流

如何在 Dart 的流构建器中切换我正在收听的流?