代码之家  ›  专栏  ›  技术社区  ›  Koraktor

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

  •  0
  • Koraktor  · 技术社区  · 15 年前

    使用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() 我们班的方法。

    附言:顺便说一句,我想用 boost::archive::binary_iarchive . 我能把它用在 stringstream 或者这是因为零字节造成的问题?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Arpegius    15 年前

    我认为应该在DataObject类定义之后添加这个:

    BOOST_CLASS_EXPORT_GUID(DataObject, "DataObject") 
    // same as BOOST_CLASS_EXPORT(DataObject)
    

    您还应该导出由此派生的所有类,并且必须包含在Transmitter::read method实现的同一文件中。而且所有派生类都应该正确地序列化它们自己。要跟踪错误,请使用xml序列化并打印所有数据并进行检查。

    如果仍然不起作用,您应该检查是否序列化了同一类型的对象,DisplayObject&和DisplayObject*将起作用,但在这种情况下,错误应该是std::bad_alloc。

    Istringstream将与boost::archive::binary_iarchive一起工作perfekt,因为底层的stringbuf和strings不使用以空结尾的cstring。