C++ boost串行化输入流错误
我正在处理一个简单的序列化类。我一直在输入流上抛出异常。我把下面的例子放在一起,用简单的术语说明我要完成的事情 我有一个简单的boost序列化示例,我遇到了一个异常:C++ boost串行化输入流错误,c++,serialization,boost,C++,Serialization,Boost,我正在处理一个简单的序列化类。我一直在输入流上抛出异常。我把下面的例子放在一起,用简单的术语说明我要完成的事情 我有一个简单的boost序列化示例,我遇到了一个异常: #include <boost/serialization/serialization.hpp> #include <boost/archive/text_oarchive.hpp> #include <boost/archive/text_iarchive.hpp> #include &
#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;
}
如果您有任何帮助,我们将不胜感激。您正在从一条空流中阅读:
std::istringstream ssi;
// ...
boost::archive::text_iarchive ar1(ssi);
此外,您还泄漏了此对象:
base *b1 = new derived();
下面是一个固定的示例,注意:
- 在使用流式数据之前关闭存档是非常好的做法/重要的
除了BOOST\u CLASS\u EXPORT\u GUID(派生的,“派生的”)
BOOST\u CLASS\u EXPORT(派生的)
- 您可以有条件地打印v2:
印刷品if (auto* d = dynamic_cast<derived*>(b1)) std::cout << "v2: " << d->v2 << std::endl;
22 serialization::archive 12 0 7 derived 1 0 0 100 v1: 10, v2: 100
谢谢你,先生。这是一个有点过于接近示例的情况。现在我看到我的流中没有任何东西可以反序列化。我只是意识到我没有警告
-ingdelete
反序列化。所以,:)谢谢你。过一会儿我再给你来一杯。在我的实际项目中,我仍然收到输入流错误异常。我正在努力简化这个问题。
#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