c++ - 如何用 Cereal 序列化 boost::uuid

标签 c++ boost boost-uuid cereal

尝试序列化这个简单的类:

class Data
{
public:
    Data();
    Data(boost::uuids::uuid id);

    Data(const Data&) = delete;
    Data& operator=(const Data&) = delete;

    inline boost::uuids::uuid getGuid() { return guid; }

    template <class Archive>
    void serialize(Archive & ar)
    {
        ar(guid);
    }

private:
    boost::uuids::uuid guid;
};

但是我收到这个错误信息

error C2338: Trying to serialize an unserializable type with an output archive. 

指向uuid。启用此功能的 boost 序列化方法是添加

#include <boost/uuid/uuid_serialize.hpp>

但这不适用于开箱即用的麦片。 Cereal 文件说

cereal archives operate on either an std::ostream or std::istream object.

所以我尝试在定义的地方添加 header ,但没有成功

#include <boost/uuid/uuid_io.hpp>

最佳答案

这适用于 Cereal JSON 文件。我还在评论中包含了一种为二进制存档执行此操作的方法。

#ifndef CEREAL_TYPES_BOOST_UUID_
#define CEREAL_TYPES_BOOST_UUID_

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>

namespace cereal
{
    template <class Archive> inline
        void save(Archive& ar, boost::uuids::uuid const& uuid)
    {
        std::string val = boost::lexical_cast<std::string>(uuid);

        ar(val);

        // Other approach, probably better for binary
        //ar(make_size_tag(static_cast<size_type>(uuid.size())));
        //for (auto it = uuid.begin(), end = uuid.end(); it != end; ++it)
        //  ar(*it);
    }

    template <class Archive> inline
        void load(Archive& ar, boost::uuids::uuid& uuid)
    {
        std::string val;

        ar(val);
        uuid = boost::lexical_cast<boost::uuids::uuid>(val);

        // Other approach, probably better for binary
        //size_type size;
        //ar(make_size_tag(size));

        //for (auto it = uuid.begin(), end = uuid.end(); it != end; ++it) {
        //  uint8_t val;
        //  ar(val);
        //  *it = val;
        //}
    }
} // namespace cereal

#endif // CEREAL_TYPES_BOOST_UUID_

关于c++ - 如何用 Cereal 序列化 boost::uuid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26989065/

相关文章:

c++ - 在 C++ 中使用 BOOST 序列化循环图

c++ - C++ 头文件中的大小写敏感性

c++ - 为什么 Linux msync 返回 "Cannot Allocate memory"?是否可以修复此错误代码?

c++ - 递归函数中的数值精度

c++ - boost asio udp async_read_from buffersize

c++ - 使用boost从文件路径中提取直接父目录

c++ - 定义静态常量通用唯一标识符(UUID)

algorithm - 如何生成每个种子字符串都相同的uuid?

c++ - 中值函数 C++ 的问题

c++ - boost::uuids::random_generator 线程安全吗?