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

时间:2014-02-19 08:32:26

标签: c++ boost boost-serialization

为什么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 ;
}

此代码是错误示例

2 个答案:

答案 0 :(得分:0)

简要地看一下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<boost::archive::text_iarchive>),这样它最初可以为null,直到你需要它为止(否则在它上面创建它)在函数中堆栈并在需要时调用它。)

答案 1 :(得分:0)

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

感谢回答。