如何改进C ++ JSON序列化程序

时间:2017-02-02 08:36:55

标签: c++ json serialization reflection

TLDR:如何改进我添加到类中的序列化方法以避免使用 JVAL C宏?

长篇故事:

我在C ++中编写了一个JSON序列化器/反序列化程序,使用rapidjson解析JSON本身和读取器/编写器类以序列化到JSON或从JSON序列化。

C ++没有反射,我想避免使用外部元文件或预编译步骤,因此为了实现它,我必须为每个我想要串行化的类添加一个接口。

注意:按照设计,我的类始终从字符串缓冲区序列化,因此我可以避免在serialize()方法中进行错误检查。

这是简单的界面:

class RJSerializer;

struct Serializable
{
    virtual void serialize(RJSerializer &) = 0;
    virtual ~Serializable() {}
};

方法serialize是我的问题的对象,实际上对于像这样的对象:

struct Group : Serializable {
    long long id;
    std::string name;
    std::string type;
    bool internal;
    std::vector<Subgroup> subgroups;

    void serialize(RJSerializer &);
};

以这种方式实施:

void Group::
serialize(RJSerializer &s)
{
    JVAL(s, id);
    JVAL(s, name);
    JVAL(s, type);
    JVAL(s, internal);
    JVAL(s, subgroups);
}

我的问题的对象是 JVAL ,它可以实现真正的&#34;魔法&#34;使用丑陋的C风格宏,我想稍微改进一下......

#define JVAL(w, a) w.Pair(#a, a)

此方法将成员 a 与名称&#34; a&#34; 相关联,然后将RJSerializer类中的C ++模板方法关联:

template <typename T>
void Pair(const char *k, T &v) { key(k); val(v); }

序列化过程的初始步骤......其余部分与您在此星球上可以找到的所有其他二进制C ++序列化程序类似......

0 个答案:

没有答案