c++ - 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 的重载?