为什么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 ;
}
此代码是错误示例
答案 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)
问题解决了。 归档有类成员是因为注册了几种类型。所以使指针太解决了。 所以我徘徊了很长时间,我发现有宏注册类型,所以不必访问存档对象。 所以我用它,我解决了问题。
感谢回答。