如何将 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<boost::archive::text_iarchive>
),以便在您需要它之前它最初可以为空(否则在堆栈中创建它一个函数并在需要时调用它)。
【讨论】:
【参考方案2】:问题已解决。 存档必须类成员是因为注册了几种类型。所以制作指针也不是解决方案。 所以我徘徊了很长时间,我发现有注册类型的宏,所以不必访问存档对象。 所以我使用它,我解决了问题。
感谢回答。
【讨论】:
以上是关于如何将 boost::iarchive 的流设置为空流的主要内容,如果未能解决你的问题,请参考以下文章