首页 > 解决方案 > Cereal 的继承和 json 序列化

问题描述

我正在寻找在 c++ 11 中用 Cereal 库派生的类 json 进行序列化。我有一个包含多个派生类的基类。每个类都有几个字段

这是我的简化代码的摘录:


#include <iostream>
#include <cereal/archives/json.hpp>
#include <cereal/types/string.hpp>
#include <cereal/types/polymorphic.hpp>
#include <cereal/types/base_class.hpp>

class Base
{
    public :

        Base() : a(0), b(""){};
        virtual ~Base(){};
        virtual std::string to_jsonString();

        template <class Archive>
        void serialize(Archive &oOArchive)
        {
            oOArchive
            (
                cereal::make_nvp("Key_a",a)
              , cereal::make_nvp("Key_b",b)
            );
        }

    protected :
        int         a;
        std::string b;
};

std::string Base::to_jsonString()
{
    std::stringstream ssMessage;
    try
    {
        cereal::JSONOutputArchive oOArchive(ssMessage);
        oOArchive( *this );
    }
    catch(const std::exception& e)
    {
        std::cout<< e.what() << std::endl ;
    }
    return ssMessage.str();
}

class Derivated:public Base
{
    public :

        Derivated() : Base(), c(5){};
        ~Derivated(){};
        std::string to_jsonString() override;

        template <class Archive>
        void serialize(Archive &oOArchive)
        {
            oOArchive
            (
                cereal::base_class<Base>( this )
              , cereal::make_nvp("Key_c",c)
            );
        }

    protected :
        int         c;
};

std::string Derivated::to_jsonString()
{
    std::stringstream ssMessage;
    try
    {
        cereal::JSONOutputArchive oOArchive(ssMessage);
        oOArchive( *this );
    }
    catch(const std::exception& e)
    {
        std::cout<< e.what() << std::endl ;
    }
    return ssMessage.str();
}

namespace cereal
{
    void prologue(cereal::JSONOutputArchive&, const Base&       ){}
    void prologue(cereal::JSONOutputArchive&, const Derivated&  ){}
    void epilogue(cereal::JSONOutputArchive&, const Base&       ){}
    void epilogue(cereal::JSONOutputArchive&, const Derivated&  ){}


}

int main()
{
    Derivated oDerivated;
    std::cout << oDerivated.to_jsonString() << std::endl;
    return EXIT_SUCCESS;
}

我在输出中得到这种格式

{
    "value0": {
        "Key_a": 0,
        "Key_b": ""
    },
    "Key_c": 5
}

我期待这种格式

{
    "Key_a": 0,
    "Key_b": ""
    "Key_c": 5
}

我怎样才能制作这种格式?

如何避免派生类对函数 to_jsonString 的重载?

标签: c++linuxc11cereal

解决方案


推荐阅读