Boost:序列化 long unsigned int

Boost : serialize long unsigned int

由于 long unsigned int 序列化,我在 boost 中遇到编译错误,我无法找到它的来源..

这是我要序列化的class:

#ifndef JUCECMAKEREPO_PERFAUDITRESPONSE_H
#define JUCECMAKEREPO_PERFAUDITRESPONSE_H

#include <string>
#include <utility>
#include <vector>
#include "boost/serialization/nvp.hpp"
#include <boost/serialization/array_wrapper.hpp>
#include "CPUStructs.h"

namespace API::Network {
    class PerfAuditResponse {
    public:
        PerfAuditResponse() = delete;

        explicit PerfAuditResponse(std::string msg, int code, const Performance::CPUData &CPUData,
                                   const std::vector<Performance::ProcessData> &processesData)
                : message(std::move(msg)),
                  httpCode(code),
                  CPUIdleTime(CPUData.GetIdleTime()),
                  CPUActiveTime(CPUData.GetActiveTime()),
                  _processesData(processesData) {
        };

    private:
        friend class boost::serialization::access;

        template<typename Archive>
        void serialize(Archive &ar, unsigned) {
            ar & BOOST_SERIALIZATION_NVP(CPUIdleTime)
            & BOOST_SERIALIZATION_NVP(CPUActiveTime)
            & BOOST_SERIALIZATION_NVP(message)
            & BOOST_SERIALIZATION_NVP(httpCode);
        }

        std::string message;
        boost::int32_t httpCode;
        std::size_t CPUIdleTime;
        std::size_t CPUActiveTime;
        const std::vector<Performance::ProcessData> &_processesData;
    };
}
#endif //JUCECMAKEREPO_PERFAUDITRESPONSE_H

这里是编译器输出:

[...]/boost-src/libs/serialization/include/boost/serialization/access.hpp:116:11 error: request for member ‘serialize’ in ‘t’, which is of non-class type ‘long unsigned int’ t.serialize(ar, file_version);

有人知道它来自哪里吗?

If I only keep message and httpCode serialization the compilation works

我不知道怎么做。您明确删除了默认构造函数。 Boost序列化需要默认构造(或者你必须实现save_construct_data/load_construct_data

这是我的简单测试器,你可以比较笔记,看看你错过了什么:

Live On Coliru

#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/integer.hpp>
//#include <boost/serialization/array_wrapper.hpp>
#include <boost/serialization/nvp.hpp>
#include <iostream>
#include <sstream>
#include <vector>

namespace Performance {
    struct CPUData {
        std::size_t idle, active;
        std::size_t GetIdleTime()  const { return 0; }
        std::size_t GetActiveTime()  const { return 0; }
    };
    struct ProcessData {
    };
} // namespace Performance

namespace API::Network {
    class PerfAuditResponse {
    public:
        //PerfAuditResponse() = delete;

        explicit PerfAuditResponse(std::string msg, int code, const Performance::CPUData &CPUData,
                                   const std::vector<Performance::ProcessData> &processesData)
                : message(std::move(msg)),
                  httpCode(code),
                  CPUIdleTime(CPUData.GetIdleTime()),
                  CPUActiveTime(CPUData.GetActiveTime()),
                  _processesData(processesData) {
        };

    private:
        friend class boost::serialization::access;

        template<typename Archive>
        void serialize(Archive &ar, unsigned) {
            ar& BOOST_SERIALIZATION_NVP(CPUIdleTime) &
                BOOST_SERIALIZATION_NVP(CPUActiveTime) &
                BOOST_SERIALIZATION_NVP(message) &
                BOOST_SERIALIZATION_NVP(httpCode);
        }

        std::string                                  message;
        boost::int32_t                               httpCode;
        std::size_t                                  CPUIdleTime;
        std::size_t                                  CPUActiveTime;
        const std::vector<Performance::ProcessData>& _processesData;
    };
}

int main() {
    std::stringstream ss;
    std::vector<Performance::ProcessData> const pdata(13, Performance::ProcessData{});

    {
        boost::archive::text_oarchive oa(ss);
        API::Network::PerfAuditResponse par("Yo", 42, {99, 320}, pdata);
        oa << par;
    }

    std::cout << ss.str() << "\n";

    {
        API::Network::PerfAuditResponse par("default", -1, {}, pdata);

        {
            boost::archive::text_iarchive ia(ss);
            ia >> par;
        }
        ss.str("");
        ss.clear();
        {
            boost::archive::text_oarchive   oa(ss);
            oa << par;
        }
        std::cout << " --- COMPARE --- \n" << ss.str() << "\n";;
    }
}

打印例如

22 serialization::archive 19 0 0 0 0 2 Yo 42

 --- COMPARE ---
22 serialization::archive 19 0 0 0 0 2 Yo 42