从抽象库反序列化无法进行Boost序列化 [英] deserialization from an abstract base fails for boost serialization

查看:125
本文介绍了从抽象库反序列化无法进行Boost序列化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以使用boost :: serialization通过抽象库序列化对象.但是,当我尝试添加反序列化时,会遇到有关抽象库的编译错误.这是我可以使用的序列化代码:

I'm able to serialize an object through an abstract base using boost::serialization. However, when I try to add deserialization, I get compile errors about the abstract base. Here's my serialization code that works:

/*
    g++ -Iinclude/ -Llib -lboost_serialization ~/Desktop/ser_ex.cpp -o stest
*/

#include <boost/serialization/serialization.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/vector.hpp>

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <boost/serialization/export.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <memory>

namespace bser = boost::serialization;
using namespace std;
namespace foo {
class AA
{
public:
    virtual void foo() = 0;
    virtual ~AA() {}
    std::string name;

    template<class Archive>
    void serialize(Archive & ar, unsigned int )
    {
        ar & name;
    }
};
BOOST_SERIALIZATION_ASSUME_ABSTRACT( AA );

class BB : public AA
{
public:
    virtual void foo() = 0;
    virtual void bar() = 0;
    virtual ~BB () {}
    int thing;

    template<class Archive>
    void serialize(Archive & ar, unsigned int )
    {
        ar.template register_type< AA >();
        ar & boost::serialization::base_object<AA>(*this);
        ar & thing;
    }
};
BOOST_SERIALIZATION_ASSUME_ABSTRACT( BB );

class CC : public BB
{
public:
    virtual void foo() {}
    virtual void bar() {}
    virtual ~CC() {}
    int otherThing;

    template<class Archive>
    void serialize(Archive & ar, unsigned int )
    {
        ar.template register_type< BB >();
        ar & boost::serialization::base_object<BB>(*this);
        ar & otherThing;
    }
};
}

BOOST_CLASS_EXPORT_KEY(foo::CC)
BOOST_CLASS_EXPORT_IMPLEMENT(foo::CC)


int main (int , char const **)
{
    std::vector< shared_ptr<foo::AA> > vv;
    vv.push_back( make_shared<foo::CC>() );

    std::ostringstream oss;
    boost::archive::binary_oarchive out_archive( oss );
    out_archive << vv;
    std::cout << oss.str() << std::endl;
}

只需将此行添加在binary_oarchive.hpp的include的正下方,就会导致代码无法编译.

Just add this line right below the include for binary_oarchive.hpp causes the code not to compile.

#include <boost/archive/binary_iarchive.hpp>

dawilcox-macOS:debug dawilcox$ make foo
dependencies: foo_main.o
building: foo_main.o
In file included from /Users/dawilcox/src/axle/foo_main.cpp:5:
In file included from /usr/local/include/boost/serialization/serialization.hpp:43:
/usr/local/include/boost/serialization/access.hpp:130:17: error: allocating an object of abstract class type 'foo::AA'
        ::new(t)T;

Boost抱怨它无法实例化我的基本类型.这就是重点–它是抽象的基本类型.

Boost is complaining that it can't instantiate my base type. That's kind of the point -- it's an abstract base type.

反序列化抽象库的正确方法是什么?

What's the proper way to deserialize an abstract base?

推荐答案

看起来我犯错的地方是我在反序列化函数中针对基类进行了注册.所以,我摆脱了:

Looks like the thing I have wrong is that I was registering against the base class in the deserialize function. So, I got rid of:

 ar.template register_type< AA >();

并更改

ar.template register_type< BB >();

ar.template register_type< CC >();

这是我的完整代码:

/*
    g++ -Iinclude/ -Llib -lboost_serialization ~/Desktop/ser_ex.cpp -o stest
*/

#include <boost/serialization/serialization.hpp>
#include <boost/serialization/nvp.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/vector.hpp>
#include <OMNIMAKE/lib/boost_serialization>

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <boost/serialization/export.hpp>
#include <boost/serialization/shared_ptr.hpp>
#include <memory>

namespace bser = boost::serialization;
using namespace std;
namespace foo {
class AA
{
public:
    virtual void foo() = 0;
    virtual ~AA() {}
    std::string name;

    template<class Archive>
    void serialize(Archive & ar, unsigned int )
    {
        ar & name;
    }
};
BOOST_SERIALIZATION_ASSUME_ABSTRACT( AA );

class BB : public AA
{
public:
    virtual void foo() = 0;
    virtual void bar() = 0;
    virtual ~BB () {}
    int thing;

    template<class Archive>
    void serialize(Archive & ar, unsigned int )
    {
        ar & boost::serialization::base_object<AA>(*this);
        ar & thing;
    }
};
BOOST_SERIALIZATION_ASSUME_ABSTRACT( BB );

class CC : public BB
{
public:
    virtual void foo() {}
    virtual void bar() {}
    virtual ~CC() {}
    int otherThing;

    template<class Archive>
    void serialize(Archive & ar, unsigned int )
    {
        ar.template register_type< CC >();
        ar & boost::serialization::base_object<BB>(*this);
        ar & otherThing;
    }
};
}

BOOST_CLASS_EXPORT_KEY(foo::CC)
BOOST_CLASS_EXPORT_IMPLEMENT(foo::CC)


int main (int , char const **)
{
    std::vector< shared_ptr<foo::AA> > vv;
    vv.push_back( make_shared<foo::CC>() );

    std::ostringstream oss;
    boost::archive::binary_oarchive out_archive( oss );
    out_archive << vv;
    std::cout << oss.str() << std::endl;
}

这篇关于从抽象库反序列化无法进行Boost序列化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆