首页 > 解决方案 > 使用谷物序列化/反序列化结构到 XML 而不修改结构接口

问题描述

我的情况如下,作为测试 API 接口的一部分,我需要将一些引用(结构和结构向量)保存为 XML。保存的 XML 文件最终将用于检索参考结构并与当前状态进行比较。我正在寻找一个可以帮助我解决该问题的库,并发现谷物库似乎是一个不错的选择。

我只是发现自己编写了很多样板代码,并且想知道我是否按照预期的方式使用该库。

示例:我想从 API 序列化结构 A,因为我不能直接修改 A 以添加序列化方法,我需要创建一个从 A 继承的结构 B,以便序列化 A 的所有属性。

struct A {
    int foo;
    float bar;
    std::string some_text;
};

struct B: public A {
    template <class Archive>
    void serialize( Archive & ar)
    {
        ar(cereal::make_nvp("foo", foo));
        ar(cereal::make_nvp("bar", bar));
        ar(cereal::make_nvp("some_text", some_text));
    }
};

1)这是使用谷物的正确方法吗?

2)有没有更好的方法或另一个库可以让我用更少的样板代码获得相同的结果?(记住有不少结构需要序列化)

注意:结构可以与来自同一 API 的其他结构嵌套。

标签: c++xmlc++11cereal

解决方案


我发现尽可能减少样板代码的最佳解决方案是按以下步骤进行(对于同一示例):

struct A {
    int foo;
    float bar;
    std::string some_text;
};

namespace cereal
{
    template<class Archive>
    void serialize( Archive & ar, A & data )
    {
        ar(cereal::make_nvp("foo", data.foo)); // or even ar(CEREAL_NVP(data .foo)) if you don't mind the name being 'data.foo'
        ar(cereal::make_nvp("bar", data .bar));
        ar(cereal::make_nvp("some_text", data .some_text));
    }
}

即使文档似乎没有以这种方式实现它

如果有人有更好的方法,我仍在寻找更好的解决方案。


推荐阅读