我在反序列化使用 Boost.Serialization 序列化的数据时遇到问题。
我想要这样的方法 DataObject* Transmitter::read()
。 DataObject
是可以使用 Transmitter::write(DataObject& data)
发送的多个类的父类。
我目前拥有的看起来像这样,但它不起作用。
DataObject* Transmitter::read()
{
std::string dataString;
// Data is read into the string here!
// The data in dataString is correct, so this isn't the problem
std::istringstream inputStream(dataString);
boost::archive::text_iarchive inputArchive(inputStream);
DataObject* data;
ia >> BOOST_SERIALIZATION_NVP(data);
return data;
}
当我这样使用它时,我得到一个带有“未注册类”的 boost::archive::archive_exception
。我查看了其他使用序列化的示例,但它在我的类的 read()
方法中不起作用。
PS:附带说明一下,我想使用 boost::archive::binary_iarchive
。我可以像在 stringstream
中那样使用它吗?还是因为零字节而造成问题?
最佳答案
我认为你应该在 DataObject 类定义之后添加:
BOOST_CLASS_EXPORT_GUID(DataObject, "DataObject")
// same as BOOST_CLASS_EXPORT(DataObject)
您还应该导出所有派生自此的类,并且必须包含在与 Transmitter::read 方法实现相同的文件中。此外,所有派生类都应该正确地序列化自己。要跟踪错误,请使用 xml 序列化并打印所有数据并进行检查。
如果仍然不行,你应该检查你是否序列化了相同类型的对象,DisplayObject& 和 DisplayObject* 会有所不同,但在这种情况下错误应该是 std::bad_alloc。
Istringstream 将与 boost::archive::binary_iarchive 完美配合,因为底层 stringbuf 和字符串不使用 NULL 终止 cstring。
关于c++ - Boost:如何在方法内部反序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1189179/