如何序列化的boost ::来,dynamic_bitset? [英] How to serialize 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屋!