我有兴趣使用 JSON 来存储用 C++ 编写的应用程序的初始参数。目前我正在测试 nlohmann/json 库以从 JSON 文件读取数据/向 JSON 文件写入数据。
我有以下班级结构:
class Layer {
public:
std::string name;
LayerType type;
...
};
class Network {
public:
std::string name;
std::vector<Layer> layers;
...
};
序列化/反序列化方法在这里:
void to_json(json& j, const Layer& layer) {
j = json{
{"name", layer.name},
{"type", layer.type}
};
}
void from_json(const json& j, Layer& layer) {
j.at("name").get_to(layer.name);
j.at("type").get_to(layer.type);
}
void to_json(json& j, const Network& network) {
j = json{
{"name", network.name},
{"layers", network.layers}
};
}
void from_json(const json& j, Network& network) {
j.at("name").get_to(network.name);
j.at("layers").get_to(network.layers);
}
所以,到目前为止,这些类都很好,可以用来读取和写入 JSON。
现在问题来了。如果我决定使用 Network 类中的层地址怎么办?
class Network {
public:
std::vector<Layer*> layers;
...
};
我应该如何重写序列化/反序列化方法?哪里可以找到类似的例子?
SK
我应该如何重写序列化/反序列化方法?
是
从语义上讲,将 C++ 对象地址存储在 json 中是没有意义的,因为您感兴趣的是结构内容,而不是它们在内存中的内部表示。
您可以例如更改您的
Network
序列化器,将指向 Layer
的指针向量转换为表示 Layer
的 json 对象数组:
void to_json(nlohmann::json& j, const Network& network) {
j["name"] = network.name;
j["layers"] = nlohmann::json::array({});
for (auto* lPtr : network.layers) {
j["layers"].push_back(*lPtr);
}
}
那么你还需要相应地调整你的
from_json
。