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
。
这是我的简单测试器,你可以比较笔记,看看你错过了什么:
#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
由于 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
。
这是我的简单测试器,你可以比较笔记,看看你错过了什么:
#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