You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中nlohmann/json序列化含Layer指针的Network类方法咨询

用nlohmann/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);
}

修改后的Network类结构

class Network {
public:
    std::string name;
    std::vector<Layer*> layers;
    // 其他成员
};

重写后的序列化/反序列化方法

序列化(to_json)

JSON只存储数据不保存内存地址,所以需要序列化指针指向的实际对象,遍历指针容器逐个解引用即可:

void to_json(json& j, const Network& network) {
    j = json{
        {"name", network.name},
        {"layers", json::array()}
    };
    for (const auto* layer_ptr : network.layers) {
        if (layer_ptr != nullptr) { // 避免空指针访问崩溃
            j["layers"].push_back(*layer_ptr);
        }
    }
}

反序列化(from_json)

反序列化时需要从JSON数据创建新的Layer对象,再把指针存入容器。注意要先清理原有指针避免内存泄漏:

void from_json(const json& j, Network& network) {
    j.at("name").get_to(network.name);
    
    // 先释放原有对象内存,防止泄漏
    for (auto* layer_ptr : network.layers) {
        delete layer_ptr;
    }
    network.layers.clear();
    
    const auto& layers_json = j.at("layers");
    for (const auto& layer_json : layers_json) {
        Layer* new_layer = new Layer();
        layer_json.get_to(*new_layer);
        network.layers.push_back(new_layer);
    }
}

关键注意事项

  • 内存泄漏风险:用原始指针的话,反序列化创建的对象需要你手动在合适的时机(比如Network析构时)调用delete释放所有layers里的指针。更推荐用std::vector<std::unique_ptr<Layer>>替代原始指针,nlohmann/json支持智能指针的序列化,还能自动管理内存,不用手动处理释放。
  • 空指针检查:序列化时一定要判断指针是否为空,不然解引用空指针会直接崩溃。
  • Layer类无需修改:原有的Layer序列化/反序列化方法可以直接复用,因为我们操作的是指针指向的Layer对象。

参考思路

nlohmann/json的核心逻辑是对数据内容进行序列化,而非内存地址。你可以基于自定义类型的序列化规则,扩展到指针容器的遍历处理——本质就是把指针转换成实际对象再序列化,反序列化时则从数据重建对象再存指针。

内容的提问来源于stack exchange,提问作者Kérdezősködő Indián

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:37:08