如何序列化的boost ::来,dynamic_bitset? [英] How to serialize boost::dynamic_bitset?

查看:401
本文介绍了如何序列化的boost ::来,dynamic_bitset?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何序列化一类具有一个boost ::来,dynamic_bitset成员?

 的#include<升压/存档/ text_oarchive.hpp>
#包括LT&;升压/存档/ text_iarchive.hpp>
#包括LT&;升压/ dynamic_bitset.hpp>
#包括LT&;升压/系列化/ bitset.hpp>
#包括LT&;&sstream GT;A级
{
    友元类的boost ::系列化::访问;
    提高::来,dynamic_bitset<> X;
    模板<类归档和GT;
    无效连载(归档和放大器; AR,const的无符号整数){
        AR&安培; X;
    }
};诠释的main()
{
    A中;
    的std :: stringstream的SS;
    提高::档案:: text_oarchive的OA(SS);
    OA<<一个;
    返回0;
}

编译给出了一个错误(提高1.57)

 在文件从/usr/include/boost/serialization/extended_type_info_typeid.hpp:37:0包括,
                 从/usr/include/boost/archive/detail/oserializer.hpp:38,
                 从/usr/include/boost/archive/detail/interface_oarchive.hpp:23,
                 从/usr/include/boost/archive/detail/common_oarchive.hpp:22,
                 从/usr/include/boost/archive/basic_text_oarchive.hpp:32,
                 从/usr/include/boost/archive/text_oarchive.hpp:31,
                 从dynamic_bitset_setial.cpp:1:
/usr/include/boost/serialization/access.hpp:在静态成员函数静态无效的boost ::系列化::访问::连载(归档和放大器,T&放大器;,unsigned int类型)与存档=的boost ::存档:: text_oarchive,T =的boost ::来,dynamic_bitset<>]':
/usr/include/boost/serialization/serialization.hpp:69:5:从'无效的boost ::序列::序列化(归档和放大器,T&放大器;,无符号整数)实例[与存档=的boost ::存档:: text_oarchive的, T =的boost ::来,dynamic_bitset<>]
/usr/include/boost/serialization/serialization.hpp:128:9:从'无效的boost ::系列化:: serialize_adl(归档和放大器,T&放大器;,无符号整数)实例[与存档=的boost ::存档:: text_oarchive的, T =的boost ::来,dynamic_bitset<>]
/usr/include/boost/archive/detail/oserializer.hpp:148:5:从'无效的boost ::存档::详细:: oserializer&LT实例;档案,T> :: save_object_data(升压::档案::细节: :basic_oarchive&放大器;,常量无效*)常量[与存档=的boost ::存档:: text_oarchive的,T =的boost ::来,dynamic_bitset<>]
dynamic_bitset_setial.cpp:25:1:从这里实例化
/usr/include/boost/serialization/access.hpp:118:9:错误:'类boost ::来,dynamic_bitset<>没有名为连载成员


解决方案

来,dynamic_bitset<> 不是序列化的,因为你已经发现了(和std :: bitset< N方式> 是不同类型的)

不用担心,不过,你可以添加它没有太多精力:

 空间boost {空间序列{    模板< typename的氩气,类型名称座类型名称的Alloc>
        而无效(AR&放大器; AR,来,dynamic_bitset<嵌段,分配>常量和放大器; BS,无符号){
            为size_t num_bits = bs.size();
            的std ::矢量<&座GT;块(bs.num_blocks());
            to_block_range(BS,blocks.begin());            AR&安培; num_bits&安培;块;
        }    模板< typename的氩气,类型名称座类型名称的Alloc>
        无效负载(AR&放大器; AR,来,dynamic_bitset<嵌段,分配>&安培; BS,无符号){
            为size_t num_bits;
            的std ::矢量<&座GT;块;
            AR&安培; num_bits&安培;块;            bs.resize(num_bits);
            from_block_range(blocks.begin(),blocks.end(),BS);
            bs.resize(num_bits);
        }    模板< typename的氩气,类型名称座类型名称的Alloc>
        无效连载(AR&放大器; AR,来,dynamic_bitset<嵌段,分配>&安培; BS,未签名版){
            split_free(AR,BS,版本);
        }}}

本作品如 住在Coliru

  INT的main(){
    A中;
    的for(int i = 0; I< 128; ++ I)
        a.x.resize(11 * I,I%2);    的std :: stringstream的SS;
    {
        提高::档案:: text_oarchive的OA(SS);
        OA<<一个;
    }
    性病::法院LT&;< ss.str();
    {
        提高::档案:: text_iarchive IA(SS);
        A B;
        IA>> b:        断言(a.x == b.x);
    }
}

请注意,如果您不能负担块复制到向量,它同样容易直接在 m_bits 级别添加序列化,但是这需要侵入性的变化(朋友访问在最低必需的)。

这样的事情会很容易地添加在拉要求提高。

那拉申请

How to serialize a class with a boost::dynamic_bitset member?

#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/dynamic_bitset.hpp>
#include <boost/serialization/bitset.hpp>
#include <sstream>

class A
{
    friend class boost::serialization::access;
    boost::dynamic_bitset<> x;
    template<class Archive>
    void serialize(Archive & ar, const unsigned int){
        ar & x;
    }
};

int main()
{
    A a;
    std::stringstream ss;
    boost::archive::text_oarchive oa(ss);
    oa << a;
    return 0;
}

Compiling gives an error (boost 1.57)

In file included from /usr/include/boost/serialization/extended_type_info_typeid.hpp:37:0,
                 from /usr/include/boost/archive/detail/oserializer.hpp:38,
                 from /usr/include/boost/archive/detail/interface_oarchive.hpp:23,
                 from /usr/include/boost/archive/detail/common_oarchive.hpp:22,
                 from /usr/include/boost/archive/basic_text_oarchive.hpp:32,
                 from /usr/include/boost/archive/text_oarchive.hpp:31,
                 from dynamic_bitset_setial.cpp:1:
/usr/include/boost/serialization/access.hpp: In static member function ‘static void boost::serialization::access::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = boost::dynamic_bitset<>]’:
/usr/include/boost/serialization/serialization.hpp:69:5:   instantiated from ‘void boost::serialization::serialize(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = boost::dynamic_bitset<>]’
/usr/include/boost/serialization/serialization.hpp:128:9:   instantiated from ‘void boost::serialization::serialize_adl(Archive&, T&, unsigned int) [with Archive = boost::archive::text_oarchive, T = boost::dynamic_bitset<>]’
/usr/include/boost/archive/detail/oserializer.hpp:148:5:   instantiated from ‘void boost::archive::detail::oserializer<Archive, T>::save_object_data(boost::archive::detail::basic_oarchive&, const void*) const [with Archive = boost::archive::text_oarchive, T = boost::dynamic_bitset<>]’
dynamic_bitset_setial.cpp:25:1:   instantiated from here
/usr/include/boost/serialization/access.hpp:118:9: error: ‘class boost::dynamic_bitset<>’ has no member named ‘serialize’

解决方案

dynamic_bitset<> is not serializable, as you've found out (std::bitset<N> is different type).

Not to worry, though, you can add it without too much effort:

namespace boost { namespace serialization {

    template <typename Ar, typename Block, typename Alloc>
        void save(Ar& ar, dynamic_bitset<Block, Alloc> const& bs, unsigned) {
            size_t num_bits = bs.size();
            std::vector<Block> blocks(bs.num_blocks());
            to_block_range(bs, blocks.begin());

            ar & num_bits & blocks;
        }

    template <typename Ar, typename Block, typename Alloc>
        void load(Ar& ar, dynamic_bitset<Block, Alloc>& bs, unsigned) {
            size_t num_bits;
            std::vector<Block> blocks;
            ar & num_bits & blocks;

            bs.resize(num_bits);
            from_block_range(blocks.begin(), blocks.end(), bs);
            bs.resize(num_bits);
        }

    template <typename Ar, typename Block, typename Alloc>
        void serialize(Ar& ar, dynamic_bitset<Block, Alloc>& bs, unsigned version) {
            split_free(ar, bs, version);
        }

} }

This works e.g. Live On Coliru

int main() {
    A a;
    for (int i=0; i<128; ++i)
        a.x.resize(11*i, i%2);

    std::stringstream ss;
    {
        boost::archive::text_oarchive oa(ss);
        oa << a;
    }
    std::cout << ss.str();
    {
        boost::archive::text_iarchive ia(ss);
        A b;
        ia >> b;

        assert(a.x == b.x);
    }
}

Note that if you can't afford to copy the blocks vector, it's equally easy to add serialization directly on the m_bits level, but that requires intrusive changes (friend access required at a minimum).

Such a thing would easily be added to boost in a pull request.

Update added that pull request

这篇关于如何序列化的boost ::来,dynamic_bitset?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆