通过地址映射对象

问题描述 投票:0回答:1

我有兴趣使用 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++ nlohmann-json
1个回答
0
投票

我应该如何重写序列化/反序列化方法?

从语义上讲,将 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

© www.soinside.com 2019 - 2024. All rights reserved.