我想要一种将对象序列化和反序列化为 JSON 的方法,尽可能自动化。
序列化: 对我来说,理想的方法是,如果我调用一个实例 JSONSerialize() 它返回一个带有 JSON 对象的字符串,该对象的所有公共属性为 "name_of_property": "value"
。对于那些原语值,这很简单,对于对象,它应该尝试调用每个 JSONSerialize() 或 ToString() 或类似的东西以递归地序列化所有公共属性。对于集合,它也应该表现正确(只是向量/数组就可以了)。
反序列化:只需创建给定对象的实例(假设是一只狗)并调用 JSONDeserialize(json_string)
,这应该填充所有公共属性,创建所需的对象以防属性不是基元,或者需要的收藏品。
一个例子应该像这样运行:
Dog *d1 = new Dog();
d1->name = "myDog";
string serialized = d1->JSONSerialize();
Dog *d2 = new Dog();
d2->JSONDeserialize(serialized);
std::cout << d2->name; // This will print "myDog"
或者像这样:
Dog *d1 = new Dog();
d1->name = "myDog";
string serialized = JSONSerializer.Serialize(d1);
Dog *d2 = JSONSerializer.Deserialize(serialized, Dog);
std::cout << d2->name; // This will print "myDog"
我怎样才能轻松做到这一点?
原文由 Vicenç Gascó 发布,翻译遵循 CC BY-SA 4.0 许可协议
为此,您需要在不存在的 C/C++ 中进行反射。您需要有一些描述类结构的元数据(成员、继承的基类)。目前,C/C++ 编译器不会在构建的二进制文件中自动提供该信息。
我也有同样的想法,我使用 GCC XML 项目来获取这些信息。它输出描述类结构的 XML 数据。我已经建立了一个项目,并在此 页面 中解释了一些关键点:
序列化很容易,但我们必须处理复杂的数据结构实现(例如 std::string,std::map),这些实现使用分配的缓冲区。反序列化更复杂,您需要重建对象及其所有成员,以及对 vtables 的引用……这是一个痛苦的实现。
例如,您可以像这样序列化:
要反序列化数据,它的工作方式如下:
输出:
通常这些实现依赖于编译器(例如 ABI 规范),并且需要外部描述才能工作(GCCXML 输出),因此不太容易集成到项目中。