我想用 nlohmann/json 库序列化我自己的 Camera 类:
class Camera
{
private:
std::string name_;
std::string camera_calibration_filename_;
cv::Mat intrinsics_;
cv::Mat distortion_;
public:
Camera() = default;
Camera(const std::string& name, const std::string& camera_calibration_filename);
NLOHMANN_DEFINE_TYPE_INTRUSIVE(Camera, name_, camera_calibration_filename_, intrinsics_, distortion_)
}
如您所见,我使用 NLOHMANN_DEFINE_TYPE_INTRUSIVE 宏来创建一个具有相同名称的简单 json。内在函数_和失真_成员具有第三方类型 cv::Mat。因此我必须在 nlohmann 命名空间中专门化 adl_serializer:
namespace nlohmann {
template<>
struct adl_serializer<cv::Mat> {
static void to_json(json &j, const cv::Mat &opt) {
j = opt;
}
static void from_json(const json &j, cv::Mat &opt) {
opt = j.get<cv::Mat>();
}
};
} // end namespace nlohmann
由于 cv::Mat 类型具有 cv::MatSize 类型的成员,因此 cv::MatStep 我必须为它们专门化 adl_serializer。由于这两种数据类型都不是可复制构造的,而是可移动构造的,因此我使用文档中描述的特殊 from_json 重载:
namespace nlohmann {
template<>
struct adl_serializer<cv::MatSize> {
static void to_json(json &j, const cv::MatSize &opt) {
j = opt;
}
static cv::MatSize from_json(const json &j) {
return {j.get<cv::MatSize>()};
}
};
template<>
struct adl_serializer<cv::MatStep> {
static void to_json(json &j, const cv::MatStep &opt) {
j = opt;
}
static cv::MatStep from_json(const json &j) {
return {j.get<cv::MatStep>()};
}
};
} // namespace nlohmann
但不幸的是,序列化/反序列化无法正常工作(序列化期间的分段错误:
Camera camera{};
std::cout << "Camera initialized" << std::endl;
nlohmann::json j = camera;
std::cout << "Camera serialized" << std::endl;
auto camera2 = j.get<Camera>();
std::cout << "Camera deserialized" << std::endl;
任何人都可以给我一个提示如何进行吗?