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 ++序列化程序类似......