方法对结构体进行序列化和反序列化:
#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;
}