如何序列化json对象而不使用Cereal将其封闭在子对象中

Ben*_*ley 3 c++ serialization json cereal

假设我有一个C++类,如下所示:

struct Point {
    int x, y, z;
};
Run Code Online (Sandbox Code Playgroud)

我想使用Cereal将该结构序列化为JSON.所以我添加了一个这样的序列化函数:

struct Point {
    int x, y, z;
    template<class Archive>
    void serialize(Archive& ar) {
        ar(CEREAL_NVP(x),
           CEREAL_NVP(y),
           CEREAL_NVP(z));
    }
};
Run Code Online (Sandbox Code Playgroud)

当Point是另一个对象的成员或数组的元素时,这可以正常工作.但是如果我想让Point成为整个JSON文件的主要对象,它就无法正常工作.例如,使用以下代码:

Point p { 1, 2, 3 };
cereal::JSONOutputArchive ar(std::cout);
ar(p);
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

{
    "value0": {
        "x": 1,
        "y": 2,
        "z": 3
    }
}
Run Code Online (Sandbox Code Playgroud)

我想删除"value0"密钥并提升对象占用整个文件,如下所示:

{
    "x": 1,
    "y": 2,
    "z": 3
}
Run Code Online (Sandbox Code Playgroud)

我似乎唯一能做的就是基本上重新实现序列化功能,手动添加键名.

Point p {1, 2, 3};
cereal::JSONOutputArchive ar(std::cout);
ar(cereal::make_nvp("x", p.x),
   cereal::make_nvp("y", p.y),
   cereal::make_nvp("z", p.z));
Run Code Online (Sandbox Code Playgroud)

有没有办法利用我已经为类实现的序列化函数来实现它?

Ben*_*ley 6

好吧,想通了.非常简单,只需要直接从对象调用serialize函数,传递归档,而不是将对象传递给归档.

Point p {1, 2, 3};
cereal::JSONOutputArchive ar(std::cout);
p.serialize(ar);
Run Code Online (Sandbox Code Playgroud)

  • 我必须找到这个答案的事实说明了谷物文档和样品是多么糟糕。 (2认同)