谷物/C++ 11 - 如何指定反序列化的可选参数
Cereal/C++ 11 - How to specify optional parameters for de-serialization
我有使用标准函数反序列化的类:
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_4
和parameter_5
是可选的。
它们可能位于输入 JSON 字符串中,也可能不在输入 JSON 字符串中。
当我尝试反序列化缺少某些参数的这种不完整的 JSON 时,我收到 Cereal "错误" - 找不到那些缺少的参数。
有没有办法指定某些参数是可选的,并且在它们不是 JSON 默认值的情况下将使用
?您可以考虑做的是添加一个"标头"或一些基本的标志结构,用于描述传入/传出存档的内容。 例如:
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;
怎么样:
..
if (exist(parameter_4, parameter_5) {
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) );
}
else {
ar(
cereal::make_nvp("parameter_1", parameter_1),
cereal::make_nvp("parameter_2", parameter_2),
cereal::make_nvp("parameter_3", parameter_3) );
}
...
或类似的东西..
相关文章:
- 如何知道QDataStream不能反序列化某些内容
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 如何反序列化数组?
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 通过 tcp 发送 C# 类并在 C++ 上反序列化
- 序列化和反序列化boost共享指针
- 在C++中使用POCO和grain对多个对象进行反序列化
- C++中整数向量的序列化/反序列化
- 使用 Json 转换器反序列化 WCF 服务中的C++字符串
- 使用 QDataStream 对原始数据进行反序列化
- 使用协议缓冲区创建通用反序列化程序
- 如何在C++中从头开始反序列化文件(没有库)
- 在协议缓冲区 c++ 中反序列化字符串数组
- 在进程的内存中序列化/反序列化
- 谷物/C++ 11 - 如何指定反序列化的可选参数
- 是否可以反序列化(从原始内存块)没有默认构造函数的对象?
- 如何从平面缓冲区中反序列化联合结构的 void* 值的大小
- 用 Boost 反序列化犰狳 colvec