首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谷类:序列化多态类型

谷类:序列化多态类型
EN

Stack Overflow用户
提问于 2015-12-04 21:40:40
回答 1查看 887关注 0票数 2

我遇到了序列化多态类型的问题。实际上,我只是将示例拆分到:http://uscilab.github.io/cereal/polymorphism.html中的几个文件中。它编译得很好,但在运行时我得到一个异常,告诉我我不能序列化一个多态类型,当到达代码中的这一行时,它没有注册: oarchive( ptr1,ptr2 );它应该将ptr1和ptr2的内容序列化为一个流。

我附加了这些文件,这样任何人都可以看到发生了什么。

提前感谢您的宝贵时间!最好,罗杰。

代码语言:javascript
复制
////////////// IBaseClass.h
    #ifndef _IBASECLASS_H_
    #define _IBASECLASS_H_

    // A pure virtual base class
    class IBaseClass
    {
    public:
      virtual void sayType() = 0;
    };

    #endif

    ////////////// DerivedClass.h
    #ifndef DERIVEDCLASS_H_
    #define DERIVEDCLASS_H_

    #include "IBaseClass.h"

    #include <cereal/types/polymorphic.hpp>

    class DerivedClass : public IBaseClass {
        void sayType();

        int x;

        template<class Archive>
        void serialize( Archive & ar )
        { ar( x ); }
    };

    #include <cereal/archives/binary.hpp>
    #include <cereal/archives/xml.hpp>
    #include <cereal/archives/json.hpp>

    // Register DerivedClassOne
    CEREAL_REGISTER_TYPE(DerivedClass);

    #endif /* DERIVEDCLASS_H_ */

    ////////////// DerivedClass2.h
    #ifndef DERIVEDCLASS2_H_
    #define DERIVEDCLASS2_H_

    #include "IBaseClass.h"

    #include <cereal/types/polymorphic.hpp>

    class DerivedClass2 : public IBaseClass {
        void sayType();

        float y;

        template<class Archive>
        void serialize( Archive & ar )
        { ar( y ); }
    };

    #include <cereal/archives/binary.hpp>
    #include <cereal/archives/xml.hpp>
    #include <cereal/archives/json.hpp>

    CEREAL_REGISTER_TYPE(DerivedClass2);

    ////////////// main.cpp
    #include "DerivedClass.h"
    #include "DerivedClass2.h"
    #include <iostream>
    #include <fstream>
    #include <memory>

    #include <cereal/archives/xml.hpp>
    #include <cereal/types/polymorphic.hpp>

    int main(int argc, char* argv[])
    {
        {
            std::ofstream os( "polymorphism_test.xml" );
            cereal::XMLOutputArchive oarchive( os );

            // Create instances of the derived classes, but only keep base class pointers
            std::shared_ptr<IBaseClass> ptr1 = std::make_shared<DerivedClass>();
            std::shared_ptr<IBaseClass> ptr2 = std::make_shared<DerivedClass2>();
            oarchive( ptr1, ptr2 );
          }

          {
            std::ifstream is( "polymorphism_test.xml" );
            cereal::XMLInputArchive iarchive( is );

            // De-serialize the data as base class pointers, and watch as they are
            // re-instantiated as derived classes
            std::shared_ptr<IBaseClass> ptr1;
            std::shared_ptr<IBaseClass> ptr2;
            iarchive( ptr1, ptr2 );

            // Ta-da! This should output:
            ptr1->sayType();  // "DerivedClassOne"
            ptr2->sayType();  // "EmbarrassingDerivedClass. Wait.. I mean DerivedClassTwo!"
          }

          return 0;
    }
EN

回答 1

Stack Overflow用户

发布于 2019-05-13 09:14:24

https://uscilab.github.io/cereal/polymorphism.html

因为您没有在cereal::base_class上进行任何序列化(这),所以没有从您的派生类到基类的路径。尝试添加:

CEREAL_REGISTER_POLYMORPHIC_RELATION(BaseClass,DerivedClassOne) CEREAL_REGISTER_POLYMORPHIC_RELATION(BaseClass,EmbarrassingDerivedClass)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34089699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档