【问题标题】:Serialise/Unserialise structure to XML using cerealwithout modifying the structure interface使用谷物序列化/反序列化结构到 XML 而不修改结构接口
【发布时间】:2020-05-04 14:16:33
【问题描述】:

我的情况如下,作为测试 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++ xml c++11 cereal


    【解决方案1】:

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

    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));
        }
    }
    

    尽管文档似乎没有以这种方式实现它Specializing the archive

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多