如何用谷物序列化 boost::uuid
How to serialize a boost::uuid with 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.
Poiting to uuid。启用此功能的提升序列化方法是添加
#include <boost/uuid/uuid_serialize.hpp>
但这不适用于开箱即用的谷物。谷物文件说
谷物档案在 std::ostream 或 std::istream 对象上运行。
所以我尝试在定义但没有运气的地方添加标题
#include <boost/uuid/uuid_io.hpp>
这适用于谷物 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_
事实上
谷物档案在 std::ostream 或 std::istream 对象上运行。
(完全)并不意味着它使用 IO 流运算符(>>、<<)。这只是存档实现。
您必须实现免费函数serialize
让 Cereal 了解您的类型。您应该能够重用 uuid_serialize.hpp
中所示的实现。很有可能你应该简单地
- 将这些定义移动到 Cereal 命名空间(最好)或 boost::uuids 命名空间(将来可能会发生冲突)中,以便 ADL 找到它们
- 最好将 UUID 视为简单的字节数组(AFAIR
boost::uuids::uuid
是一种 POD 数据类型)
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- boost::进程间消息队列引发错误
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- cmake如何在fedora工作站中找到boost静态库包
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- Boost Graph Library,修复节点大小
- 什么是"#include <boost/functional/hash.hpp> "?
- 基于boost的程序的静态链接——zlib问题
- C++:如何在CLion IDE中安装Boost
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何在boost beast http请求中设置http头
- 致命错误:找不到'boost/uuid/uuid.hpp'文件
- Generate boost::uuids::uuid from boost::compute::detail::sha
- 如何将 time-uuid(存储在 boost uuid 中)转换为时间戳/自纪元以来的时间?
- 如何将Windows GUID转换为boost::uuid?
- 如何用谷物序列化 boost::uuid
- 在 std::set<boost::uuids::uuid> 的析构函数中,我在 _int_free 中遇到了分段错误(核心转储)。为什么?
- 跨不同数据库的Boost::uuid / unique
- Boost::uuid::uuid作为std::unordered_map中的键
- 是否使用默认的mt19937 RNG对会话id安全生成boost uuid ?