【问题标题】:How to serialize derived class by pointer to base class? Derived::serialize not called如何通过指向基类的指针序列化派生类? Derived::serialize 未调用
【发布时间】:2015-01-13 21:36:04
【问题描述】:

我正在尝试通过使用指向基类的指针增强序列化来使派生类可序列化。

Base::serialization 调用。未调用 Derived::serialization。

我做错了什么?

#include <sstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/assume_abstract.hpp>

struct Base
{
    int x;
    Base() { x = 0; }
    virtual ~Base() {}

    template<class Archive>
    void serialize(Archive &ar, const unsigned int version)
    {
        ar & x;
    }
};

BOOST_SERIALIZATION_ASSUME_ABSTRACT(Base)

struct Derived : Base
{
    int y;
    Derived() { x = 1; y = 2; }
    virtual ~Derived() {}

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & boost::serialization::base_object<Base>(*this);
        ar & y;
    }
};

int main()
{
    Derived derived;
    Base *basePtr = &derived;

    std::string s;
    std::stringstream ss(s);
    boost::archive::binary_oarchive oa(ss);

    oa << *basePtr;
}

【问题讨论】:

  • 已编辑。还是不行。
  • 如果说void serialize:成员函数模板不能是虚拟的。
  • 确实,为了允许 RTTI,必须使所涉及的类型成为虚拟类型(请注意,Boost Any 在 boost 1.57.0 中不再需要 RTTI,也许将来这种技术也可以用于 Boost Serialization)

标签: c++ serialization boost polymorphism


【解决方案1】:

首先,你不是通过指针序列化,修复它:

oa << basePtr;

其次,需要注册派生类型:

oa.register_type<Derived>();

或者,在序列化函数内部:

ar.template register_type<Derived>();

您可能_还想查看注册类信息以进行序列化:http://www.boost.org/doc/libs/1_57_0/libs/serialization/doc/special.html#export


更新到评论/编辑问题:

您的问题代码序列化 Base* 并反序列化 Derived。类型不相关,这永远行不通。它们必须相同。

另外,注册读取输入存档的 Derived 类型。

Live On Coliru

#include <sstream>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/assume_abstract.hpp>

struct Derived;

struct Base
{
    int x;
    Base() { x = 0; }
    virtual ~Base() {}

    template<class Archive>
    void serialize(Archive &ar, const unsigned int version)
    {
        ar.template register_type<Derived>();
        ar & x;
    }
};

BOOST_SERIALIZATION_ASSUME_ABSTRACT(Base)

struct Derived : Base
{
    int y;
    Derived() { x = 1; y = 2; }
    virtual ~Derived() {}

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & boost::serialization::base_object<Base>(*this);
        ar & y;
    }
};

int main()
{
    std::stringstream ss;

    {
        Derived derived;
        Base *basePtr = &derived;

        boost::archive::binary_oarchive oa(ss);
        oa.register_type<Derived>();

        oa << basePtr;
        ss.flush();
    }

    {
        boost::archive::binary_iarchive ia(ss);
        ia.register_type<Derived>();

        Base *basePtr = nullptr;

        ia >> basePtr;
        std::cout << "basePtr->x = " << basePtr->x << "\n";
        if (Derived* derivedPtr = dynamic_cast<Derived*>(basePtr))
            std::cout << "derivedPtr->y = " << derivedPtr->y << "\n";
    }
}

【讨论】:

  • 输入不起作用。你能帮助我吗?问题已编辑。
  • 等一下。 you just unaccept this answer,只是为了问/一个不同的问题/?你应该只发布一个新问题。如果你问我,这是一个非常愚蠢的举动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 2010-12-24
  • 2016-07-03
  • 2012-08-08
  • 2015-03-04
  • 1970-01-01
  • 2020-04-07
相关资源
最近更新 更多