C++ 谷物:序列化多态类型

C++ 谷物:序列化多态类型,c++,serialization,cereal,C++,Serialization,Cereal,我在序列化多态类型时遇到问题。实际上,我只是把这个例子分成几个文件。它编译得很好,但在运行时,我遇到一个异常,告诉我当到达代码中的这一行时,无法序列化未注册的多态类型: 欧奇维(ptr1,ptr2); 将ptr1和ptr2的内容序列化为流 我附上这些文件以便任何人都能看到发生了什么 提前感谢您的时间! 最好的, 罗杰 ///IBaseClass.h #ifndef\u IBASECLASS\u H_ #定义类_ //纯虚拟基类 第二类 { 公众: 虚拟void sayType()=0; }; #

我在序列化多态类型时遇到问题。实际上,我只是把这个例子分成几个文件。它编译得很好,但在运行时,我遇到一个异常,告诉我当到达代码中的这一行时,无法序列化未注册的多态类型: 欧奇维(ptr1,ptr2); 将ptr1和ptr2的内容序列化为流

我附上这些文件以便任何人都能看到发生了什么

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

///IBaseClass.h
#ifndef\u IBASECLASS\u H_
#定义类_
//纯虚拟基类
第二类
{
公众:
虚拟void sayType()=0;
};
#恩迪夫
//////////////派生类
#ifndef派生类\u H_
#定义派生类_
#包括“IBaseClass.h”
#包括
类派生类:公共IBaseClass{
void-sayType();
int x;
模板
作废序列化(存档和ar)
{ar(x);}
};
#包括
#包括
#包括
//注册一级
谷物登记类型(衍生类);
#endif/*派生类*/
//////////////衍生类别2.h
#ifndef DERIVEDCLASS2\u H_
#定义派生类2_H_
#包括“IBaseClass.h”
#包括
类派生类2:公共IBaseClass{
void-sayType();
浮动y;
模板
作废序列化(存档和ar)
{ar(y);}
};
#包括
#包括
#包括
谷物登记类型(衍生类别2);
//////////////main.cpp
#包括“DerivedClass.h”
#包括“DerivedClass2.h”
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
{
std::of Stream os(“多态性_test.xml”);
谷物:XMLOutputArchive(os);
//创建派生类的实例,但只保留基类指针
std::shared_ptr ptr1=std::make_shared();
std::shared_ptr ptr2=std::make_shared();
欧奇维(ptr1,ptr2);
}
{
ifstream是(“多态性_test.xml”);
谷物:XMLInputArchive(is);
//将数据反序列化为基类指针,并按原样观察
//重新实例化为派生类
std::共享的ptr ptr1;
std::共享的ptr ptr2;
Irachive(ptr1,ptr2);
//Ta da!这应该输出:
ptr1->sayType();/“DerivedClassOne”
ptr2->sayType();/“让DerivedClass难堪。等等……我是说DerivedClass2!”
}
返回0;
}

由于您没有对Groove::base_类(this)进行任何序列化,因此没有从派生类到基类的路径。尝试添加:

谷物\寄存器\多态\关系(基类,派生类)
谷物\u寄存器\u多态\u关系(基类、尴尬的派生类)

您使用的是哪个编译器/操作系统?你能粘贴你编译时使用的确切命令吗?有点老了,这对OP有帮助,但是如果有人在搜索,这可能会有帮助。
////////////// 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;
    }