c++ - Boost:如何在方法内部反序列化?

标签 c++ serialization boost polymorphism

我在反序列化使用 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/

相关文章:

javascript - 在 Redux 存储中存储不可序列化的数据项的实际风险是什么?

ios - Boost::Geometry (1.53) 与 iOS

c++ - 从文本文件/文本流错误中读取 QStrings

java - 在 Java 中反序列化不可信数据的安全影响是什么?

c++ - 在 Arduino IDE 中使用正则表达式库时未定义对 `longjmp' 的引用

c# - 有没有办法在 View 状态中存储匿名委托(delegate)?

c++ - boost 文字序列化版本(15 vs 18)

C++ Boost 序列化 序列化模板派生类

类对象数组中的 C++ 内存

c++ - 断言失败 - 在 Unity-Xbox 上崩溃