【问题标题】:Using Cereal to serialize templated polymorphic types in a library使用 Cereal 序列化库中的模板化多态类型
【发布时间】:2016-10-20 12:47:04
【问题描述】:

我有一个模板化的基类:

template<typename T>
class A {
    public:
    T a;

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

以及从它派生的模板类:

template<typename T>
class B : public A<T> {
    public:
    T b;

    template<class Archive>
    void serialize(Archive & ar) {
        ar(cereal::base_class<A<T>>(this));
        ar(b);
    }
};

在另一个序列化类中使用:

template<typename T>
class C {

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

    std::vector<std::shared_ptr<A<T>>> collection;
};

这段代码和使用它的代码被编译成一个静态库

根据我对需要添加的谷物文档的理解

CEREAL_REGISTER_TYPE(A<double>)
CEREAL_REGISTER_TYPE(A<float>)

CEREAL_REGISTER_TYPE(B<double>)
CEREAL_REGISTER_TYPE(B<float>)

每个类的头文件中将使用的每种类型的等

这编译。但运行时错误为

试图保存未注册的多态类型 (B)。确保 您的类型已使用 CEREAL_REGISTER_TYPE 注册,并且存档 您正在使用的已包含(并已注册 CEREAL_REGISTER_ARCHIVE) 在调用 CEREAL_REGISTER_TYPE 之前。如果 您的类型已经注册,但您仍然看到此错误,您可能 需要使用 CEREAL_REGISTER_DYNAMIC_INIT。

从文档中,我认为我需要在标题中添加 CEREAL_FORCE_DYNAMIC_INIT(libname),在 CPP 文件中添加 CEREAL_REGISTER_DYNAMIC_INIT,但没有 cpp 文件。或者一个合适的 CPP 文件来放置它。

添加CEREAL_REGISTER_POLYMORPHIC_RELATION 与预期没有什么区别,因为B 的序列化函数使用cereal::base_class 调用基本类A 有没有办法使用 Cereal 序列化模板类?

【问题讨论】:

  • 抱歉,转录错误,错过了
  • 您的示例中的类型似乎不是多态的...它们实际上代表您的真实代码吗?如果是这样,那是一个奇怪的错误
  • Have you followed the documentation?你用过CEREAL_REGISTER_POLYMORPHIC_RELATION(如果需要的话;我完全不熟悉谷物)?我同意 xaxxon 你发布的代码不是多态的。
  • 根据docs CEREAL_REGISTER_POLYMORPHIC_RELATION 仅在子类不使用 grain::base_class 调用基类时才需要。我在做什么。
  • 已更新以显示多态用法。

标签: c++ templates cereal


【解决方案1】:

问题归结为包含标题的顺序和包含它们的位置,以及少量的 RTFM。

需要在基类头文件中:

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

加上我想序列化的任何其他类型。

然后在子类中为每个支持的类型添加CEREAL_REGISTER_TYPE

如文档中所述,关键是包含存档类型之前 CEREAL_REGISTER_TYPE。它们不必与类声明在同一个文件中。只需在注册类型之前包含标头即可。

【讨论】:

    猜你喜欢
    • 2016-03-09
    • 1970-01-01
    • 2014-05-16
    • 2019-09-18
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多