3

で派生クラスをシリアライズしようとすると、 (Boost 1.53.0 の 436 行目)boost::serializationのアサーションがトリップします。boost/archive/detail/oserializer.hpp

const basic_pointer_oserializer * bpos
    = static_cast<const basic_pointer_oserializer *>(
        boost::serialization::singleton<
            archive_serializer_map<Archive>
        >::get_const_instance().find(*true_type)
    );
BOOST_ASSERT(NULL != bpos);

ここに私のMWEがあります:

#include <iostream>
#include <fstream>

#include <boost/archive/polymorphic_xml_oarchive.hpp>

#include <boost/serialization/nvp.hpp>
#include <boost/serialization/access.hpp>
#include <boost/serialization/base_object.hpp>

class base
{
    friend class boost::serialization::access;

    template <class Archive>
    void serialize(Archive &ar, const unsigned int version)
    {
        ar & boost::serialization::make_nvp("test", test);
    }

    int test;

public:
    virtual void print() { std::cout << 1 << std::endl; }
};

class derived : public base
{
    friend class boost::serialization::access;

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

    int test2;

public:
    void print() { std::cout << 2 << std::endl; }
};

int main (int argc, char const *argv[])
{
    base *b = new derived();

    std::ofstream stream("out.xml");
    boost::archive::polymorphic_xml_oarchive ar(stream);
    ar.register_type<derived>();
    ar << boost::serialization::make_nvp("b", b);

    return 0;
}

BOOST_CLASS_EXPORT_GUIDの代わりに も使用してみましregister_typeたが、それもうまくいきませんでした。私が間違っていることは何か分かりますか?

4

1 に答える 1

2

おそらく、 polymorphic_xml_archive (ドキュメントを参照)を使用するつもりはありません。

特に、ポリモーフィック アーカイブはアーカイブのインターフェイスと関係があり、シリアル化するエンティティとは関係ありません (常にポリモーフィックである可能性があります)。

代わりに使用xml_archiveすると、問題はなくなります。

于 2013-06-15T23:10:40.483 に答える