ZBLOG

yaml-cpp 自定解析结构体 struct AppAllNamespace std::vector vec; }; 使用encode和decode

方法对结构体进行序列化和反序列化:

#include <yaml-cpp/yaml.h>

struct NsStore {
    std::string ns_name;
    std::string store_name;
};

struct AppAllNamespace {
    std::vector<NsStore> vec;
};

namespace YAML {

template<>
struct convert<NsStore> {
    static Node encode(const NsStore& ns_store) {
        Node node;
        node["ns_name"] = ns_store.ns_name;
        node["store_name"] = ns_store.store_name;
        return node;
    }

    static bool decode(const Node& node, NsStore& ns_store) {
        if (!node.IsMap() || node.size() != 2) {
            return false;
        }

        ns_store.ns_name = node["ns_name"].as<std::string>();
        ns_store.store_name = node["store_name"].as<std::string>();
        return true;
    }
};

template<>
struct convert<AppAllNamespace> {
    static Node encode(const AppAllNamespace& app_all_ns) {
        Node node;
        for (const auto& ns_store : app_all_ns.vec) {
            node.push_back(ns_store);
        }
        return node;
    }

    static bool decode(const Node& node, AppAllNamespace& app_all_ns) {
        if (!node.IsSequence()) {
            return false;
        }

        app_all_ns.vec.clear();
        for (const auto& ns_node : node) {
            NsStore ns_store;
            if (!ns_node.as<NsStore>(ns_store)) {
                return false;
            }
            app_all_ns.vec.push_back(ns_store);
        }
        return true;
    }
};

}

int main() {
    AppAllNamespace app_all_ns;
    app_all_ns.vec.push_back({"ns1", "store1"});
    app_all_ns.vec.push_back({"ns2", "store2"});

    // 序列化为 YAML 字符串
    std::cout << YAML::Dump(app_all_ns) << std::endl;

    // 从 YAML 字符串反序列化回来
    AppAllNamespace decoded_app_all_ns = YAML::Load<AppAllNamespace>(R"(
        - ns_name: ns1
          store_name: store1
        - ns_name: ns2
          store_name: store2
    )");
    for (const auto& ns_store : decoded_app_all_ns.vec) {
        std::cout << ns_store.ns_name << ", " << ns_store.store_name << std::endl;
    }

    return 0;
}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=254

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?