0

我想用 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;

任何人都可以给我一个提示如何进行吗?

4

0 回答 0