gpt4 book ai didi

c++ - Cereal/C++ 11 - 如何为反序列化指定可选参数

转载 作者:行者123 更新时间:2023-12-03 17:41:10 25 4
gpt4 key购买 nike

我有一个用标准函数反序列化的类:

template<class Archive> // public serialization (normal)
void serialize(Archive & ar)
{
ar(
cereal::make_nvp("parameter_1", parameter_1),
cereal::make_nvp("parameter_2", parameter_2),

cereal::make_nvp("parameter_3", parameter_3),

cereal::make_nvp("parameter_4", parameter_4),

cereal::make_nvp("parameter_5", parameter_5) );
}

但在我的例子中,parameter_4parameter_5 是可选的。

它们可能在也可能不在输入的 JSON 字符串中。

当我尝试反序列化这种缺少某些参数的不完整 JSON 时,我收到 Cereal“错误”- 无法找到那些缺少的参数。

有什么方法可以指定某些参数是可选的,并且在它们不是 JSON 的一部分的情况下将使用默认值吗?

最佳答案

您可能会考虑添加一个“ header ”或一些基本标志结构来描述正在传入/传出存档的内容。例如:

struct Header // can be made private
{
bool has_parameter_4;
bool has_parameter_5;
};

template<class Archive> // public serialization (normal)
void serialize(Archive & ar)
{
// for saving - indicate whether you want the parameters to be saved
// for loading - these initial values will be overwritten and do not matter
Header header {should_save_parameter_4(),
should_save_parameter_5()};

ar(cereal::make_nvp("header", header),
cereal::make_nvp("parameter_1", parameter_1),
cereal::make_nvp("parameter_2", parameter_2),
cereal::make_nvp("parameter_3", parameter_3));
if (header.has_parameter_4)
ar(cereal::make_nvp("parameter_4", parameter_4));
if (header.has_parameter_5)
ar(cereal::make_nvp("parameter_5", parameter_4));
}

此方法的主要缺点是您在 JSON/XML/二进制文件中保存了额外的信息。

注意:虽然此问题特定于 C++ 11,但在 C++ 17 中引入了 std::optional(以及 cereal 对 std::的支持) optional) 您可以简单地将相关属性指定为可选属性,cereal 将处理其余部分。例如:

std::optional<your_type_t> parameter_4 = std::nullopt;

关于c++ - Cereal/C++ 11 - 如何为反序列化指定可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50371213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com