Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将boost::uuid序列化为_C++_Boost_Boost Uuid_Cereal - Fatal编程技术网

C++ 如何将boost::uuid序列化为

C++ 如何将boost::uuid序列化为,c++,boost,boost-uuid,cereal,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 A

正在尝试序列化此简单类:

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;
};
指向uuid。实现这一点的boost序列化方法是添加

#include <boost/uuid/uuid_serialize.hpp>
#包括
但这不适用于盒装麦片。谷物文件说

谷物档案在std::ostream或std::istream对象上运行

所以我试着在有定义的地方添加标题,但是没有运气

#include <boost/uuid/uuid_io.hpp>
#包括
事实上

谷物档案在std::ostream或std::istream对象上运行


(根本)并不意味着它使用IO流操作符(>>,这可以处理Google 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_
\ifndef谷物类型\u BOOST\UUID_
#定义谷物类型_
#包括
#包括
#包括
名称空间谷物
{
模板内联
无效保存(归档和存档,boost::uuid::uuid const和uuid)
{
std::string val=boost::词法转换(uuid);
ar(val);
//另一种方法,可能对二进制更好
//ar(make_size_标记(静态_cast(uuid.size())));
//对于(auto-it=uuid.begin(),end=uuid.end();it!=end;++it)
//ar(*it);
}
模板内联
无效加载(归档和存档,boost::uuid::uuid和uuid)
{
std::字符串val;
ar(val);
uuid=boost::词法转换(val);
//另一种方法,可能对二进制更好
//大小\类型大小;
//ar(制造尺寸标签(尺寸));
//对于(auto-it=uuid.begin(),end=uuid.end();it!=end;++it){
//uint8_t val;
//ar(val);
//*it=val;
//}
}
}//名称空间谷物
#endif//graines\u TYPES\u BOOST\u UUID_

Boost不是谷物,所以,您应该用谷物编写
Boost::uuid
的序列化。@kittikun我想知道,这个答案是不是有点糟糕(您现在已经取消投票了?)是的,很抱歉,我想答案可能没有直接回答这个问题。不管怎样,我投了你的票back@kittikun噢,谢谢。老实说,我认为你应该接受你自己的答案,因为“它解决了你的问题”,而你可以直接投票给这个(“这个答案很有用”)来代替?
#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_