Boost序列化输入流错误

5

我正在开发一个简单的序列化类。在输入流上一直抛出异常。以下是我试图用简单的术语完成的示例。

我有一个boost序列化的简单示例,但我在其中遇到了异常:

#include <boost/serialization/serialization.hpp> 
#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/serialization/export.hpp> 
#define NVP(X) X 

class base { 
public: 
friend class boost::serialization::access; 
base (){ v1 = 10;} 
int v1; 
template<class Archive> 
void serialize(Archive & ar, const unsigned int file_version) 
{ 

    ar & NVP(v1); 
} 
virtual void bla()=0; 
}; 


class derived : public base { 
public: 
friend class boost::serialization::access; 
int v2 ; 
derived() { v2 = 100;} 
template<class Archive> 
void serialize(Archive & ar, const unsigned int file_version){ 
    boost::serialization::base_object<base>(* this); 
    ar & NVP(v2); 
} 

virtual void bla(){};
};
BOOST_CLASS_EXPORT(base);
BOOST_CLASS_EXPORT_GUID(derived, "derived");

int main ( )
{
std::stringstream ss;
boost::archive::text_oarchive ar(ss);
base *b = new derived();
ar << NVP(b);
std::cout << ss.str()<<std::endl;



std::istringstream ssi;
base *b1 = new derived();
{
boost::archive::text_iarchive ar1(ssi);
ar1 >> b1;
}
//std::cout << ssi.str();
std::cout << "v1: " << b1->v1 << std::endl;

}

我收到的异常是:
terminate called after throwing an instance of 'boost::archive::archive_exception'
  what():  input stream error

非常感谢您的帮助。

1个回答

4
您正在读取一个空流:
std::istringstream ssi;
// ...
boost::archive::text_iarchive ar1(ssi);

另外,您泄漏了这个对象:

base *b1 = new derived();

这是一个固定的例子,注意事项:

  • it's very good practice/important to close archives before using the streamed data
  • BOOST_CLASS_EXPORT_GUID(derived, "derived") doesn't add anything beyond BOOST_CLASS_EXPORT(derived)
  • you can print the v2 conditionally:

    if (auto* d = dynamic_cast<derived*>(b1))
        std::cout << "v2: " << d->v2 << std::endl;
    
  • I've used bla() as an example to print the values instead

  • NVP() is a bit iffy there. Why not just leave it out for non-tagged archives (ie. other than XML)? If you intend to support XML, just use BOOST_SERIALIZATION_NVP, boost::serialization::make_nvp etc.

  • std::cout << "v2: " << b1->v2 << std::endl; was completely out of place

  • just initialize b1 to null so you don't leak it; remember to free all pointers (use smart pointers!)

  • the mix of public: and friend in your types didn't really mean much

Live On Coliru

#include <boost/serialization/serialization.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/export.hpp>
#include <sstream>

class base {
  public:
    base(int v1) : v1(v1) {}
    virtual void bla() const = 0;

  private:
    friend class boost::serialization::access;

    template <class Archive> void serialize(Archive &ar, unsigned /*int const file_version*/) {
        ar & BOOST_SERIALIZATION_NVP(v1);
    }
  protected:
    int v1;
};

class derived : public base {
  public:
    derived(int v1 = 10, int v2 = 100) : base(v1), v2(v2) {}
    virtual void bla() const {
        std::cout << "v1: " << v1 << ", v2: " << v2 << "\n";
    }

  private:
    friend class boost::serialization::access;
    int v2;
    template <class Archive> void serialize(Archive &ar, unsigned /*int const file_version*/) {
        boost::serialization::base_object<base>(*this);
        ar & BOOST_SERIALIZATION_NVP(v2);
    }
};

BOOST_CLASS_EXPORT(base)
BOOST_CLASS_EXPORT(derived)

int main() {
    std::stringstream ss;
    {
        boost::archive::text_oarchive ar(ss);
        base *b = new derived();
        ar << boost::serialization::make_nvp("base", b);

        delete b; // TODO use RAII instead
    }

    std::cout << ss.str() << std::endl;
    base *deserialized = nullptr;
    {
        boost::archive::text_iarchive ar1(ss);
        ar1 >> boost::serialization::make_nvp("base", deserialized);
    }

    deserialized->bla();
    delete deserialized;
}

打印

22 serialization::archive 12 0 7 derived 1 0
0 100

v1: 10, v2: 100

谢谢您先生。这是一个跟随示例过于严格的情况。现在我看到我的流里面实际上没有任何可反序列化的内容。 - user249806
我突然意识到我没有警告过关于删除反序列化的内容。所以,请将其添加到清单中 :) - sehe
谢谢,sehe。我马上会有另一个问题需要你帮忙。在我的实际项目中,我仍然遇到输入流错误异常。我正在努力简化这个问题。 - user249806

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接