我正在使用C ++ Boost库1.6.3将游戏的主类序列化并保存到文本文件,该游戏的主类内部具有作为指针和引用,数组和基本类型变量的附加类,问题是当我加载文件时,它崩溃后显示以下输出:
Assertion failed: register_type(bpis_ptr->get_basic_serializer()) == cid, file libs\serialization\src\basic_iarchive.cpp, line 454
问题是该类与序列化的其他类相似,并且它们没有错误。
要进行序列化,这是我在按照boost :: serialization指令执行的操作:1)在基类中:添加用于进行序列化访问的friend类,以及用于序列化的函数,例如:
class BJShoe
{
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int file_version)
{
ar & BOOST_SERIALIZATION_NVP(totalCards);
ar & BOOST_SERIALIZATION_NVP(cards);
ar & BOOST_SERIALIZATION_NVP(numCards);
}
protected:
int totalCards[10],
cards[10],
numCards;
}
因此,对于主类,我有类似以下内容:
class Game {
int numDecks;
bool hitSoft17;
bool doubleAnyTotal;
bool double9;
bool doubleSoft;
bool doubleAfterHit;
bool doubleAfterSplit;
bool resplit;
bool resplitAces;
bool lateSurrender;
int dealerSpeed;
BJStrategy maxValueStrategy;
Progress progress;
// Release all objects on exit
BJRules *rules;
Player *strategy;
Hand *dealer;
Probabilities *dealerProbabilities;
Shoe *shoe;
BJShoe *distribution;
PlayerHand *tempHand;
//counters and game-loop vars
int lastWager;
int balance;
Card tempCard;
PlayerHand playerHands[4];
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar.template register_type<BJShoe*>();
ar.template register_type<PlayerHand*>();
//etc.
ar.template register_type<BJShoe>();
ar.template register_type<PlayerHand>();
cout << "numDecks\n";
ar & BOOST_SERIALIZATION_NVP(numDecks);
cout << "hitSoft17\n";
ar & BOOST_SERIALIZATION_NVP(hitSoft17);
cout << "doubleAnyTotal\n";
ar & BOOST_SERIALIZATION_NVP(doubleAnyTotal);
cout << "double9\n";
ar & BOOST_SERIALIZATION_NVP(double9);
cout << "doubleSoft\n";
ar & BOOST_SERIALIZATION_NVP(doubleSoft);
cout << "doubleAfterHit\n";
ar & BOOST_SERIALIZATION_NVP(doubleAfterHit);
cout << "doubleAfterSplit\n";
ar & BOOST_SERIALIZATION_NVP(doubleAfterSplit);
cout << "resplit\n";
ar & BOOST_SERIALIZATION_NVP(resplit);
cout << "resplitAces\n";
ar & BOOST_SERIALIZATION_NVP(resplitAces);
cout << "lateSurrender\n";
ar & BOOST_SERIALIZATION_NVP(lateSurrender);
cout << "dealerSpeed\n";
ar & BOOST_SERIALIZATION_NVP(dealerSpeed);
cout << "maxValueStrategy\n";
ar & BOOST_SERIALIZATION_NVP(maxValueStrategy);
cout << "progress\n";
ar & BOOST_SERIALIZATION_NVP(progress);
cout << "rules\n";
ar & BOOST_SERIALIZATION_NVP(rules);
cout << "strategy\n";
ar & BOOST_SERIALIZATION_NVP(strategy);
cout << "dealer\n";
ar & BOOST_SERIALIZATION_NVP(dealer);
cout << "dealerProbabilities\n";
ar & BOOST_SERIALIZATION_NVP(dealerProbabilities);
cout << "shoe\n";
ar & BOOST_SERIALIZATION_NVP(shoe);
cout << "distribution\n";
ar & BOOST_SERIALIZATION_NVP(distribution);
cout << "tempHand\n";
ar & BOOST_SERIALIZATION_NVP(tempHand);
cout << "lastWager\n";
ar & BOOST_SERIALIZATION_NVP(lastWager);
cout << "balance\n";
ar & BOOST_SERIALIZATION_NVP(balance);
cout << "tempCard\n";
ar & BOOST_SERIALIZATION_NVP(tempCard);
/*for (int i = 0; i < 4; i++) {
ar & BOOST_SERIALIZATION_NVP(playerHands[i]);
cout << "playerHands["<<i<<"]\n";
}*/
ar & BOOST_SERIALIZATION_NVP(playerHands);
cout << "playerHands\n";
}
}
2)在子类中,执行与(1)相同的操作,并添加base_object函数,例如从BJShoe继承的Shoe的示例:
boost::serialization::base_object<BJShoe>(*this);
3)导出cpp中的类,例如:
BOOST_CLASS_EXPORT(Shoe)
BOOST_CLASS_EXPORT(BJShoe)
4)功能保存
void Game::save(const char* filename)
{
ofstream ofs(filename);
if (!ofs.good()) return;
text_oarchive oa(ofs);
//register all the classes, example:
oa.register_type<Shoe>();
oa.register_type<BJShoe>();
oa.register_type<Game>();
oa << boost::serialization::make_nvp("game",instance);
ofs.close();
}
5)函数加载:
void Game::load(const char* filename)
{
ifstream ifs(filename);
if (!ifs.good()) return;
text_iarchive ia(ifs);
//register all the classes, example:
ia.register_type<Shoe>();
ia.register_type<BJShoe>();
ia.register_type<Game>();
ia >> boost::serialization::make_nvp("game",instance);
ifs.close();
}
6)调用save(“ play.data”); load(“ play.data”); 导致程序崩溃,这是日志:
./bj play
numDecks
hitSoft17
doubleAnyTotal
double9
doubleSoft
doubleAfterHit
doubleAfterSplit
resplit
resplitAces
lateSurrender
dealerSpeed
maxValueStrategy
progress
rules
strategy
dealer
dealerProbabilities
shoe
distribution
Segmentation fault
[jbelon@localhost cpp]$ gdb ./bj
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-94.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /var/www/html/blackjack/cpp/bj...done.
(gdb) run play
Starting program: /var/www/html/blackjack/cpp/./bj play
numDecks
hitSoft17
doubleAnyTotal
double9
doubleSoft
doubleAfterHit
doubleAfterSplit
resplit
resplitAces
lateSurrender
dealerSpeed
maxValueStrategy
progress
rules
strategy
dealer
dealerProbabilities
shoe
distribution
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7bad05c in boost::archive::detail::basic_iarchive_impl::load_preamble (this=0x6bd4c0, ar=..., co=...) at libs/serialization/src/basic_iarchive.cpp:319
319 if(co.bis_ptr->class_info()){
(gdb) backtrace
#0 0x00007ffff7bad05c in boost::archive::detail::basic_iarchive_impl::load_preamble (this=0x6bd4c0, ar=..., co=...) at libs/serialization/src/basic_iarchive.cpp:319
#1 0x00007ffff7bae132 in boost::archive::detail::basic_iarchive_impl::load_pointer (this=0x6bd4c0, ar=..., t=@0x6bdcb8: 0x6bd790,
bpis_ptr=0x6b7190 <boost::serialization::singleton<boost::archive::detail::pointer_iserializer<boost::archive::text_iarchive, BJShoe> >::get_instance()::t>, finder=<optimized out>)
at libs/serialization/src/basic_iarchive.cpp:446
#2 0x0000000000457063 in boost::archive::detail::load_pointer_type<boost::archive::text_iarchive>::invoke<BJShoe*> (ar=..., t=@0x6bdcb8: 0x6bd790)
at /usr/include/boost/archive/detail/iserializer.hpp:524
#3 0x0000000000456484 in boost::archive::load<boost::archive::text_iarchive, BJShoe*> (ar=..., t=@0x6bdcb8: 0x6bd790) at /usr/include/boost/archive/detail/iserializer.hpp:592
#4 0x000000000045609e in boost::archive::detail::common_iarchive<boost::archive::text_iarchive>::load_override<BJShoe*> (this=0x7fffffffdb80, t=@0x6bdcb8: 0x6bd790)
at /usr/include/boost/archive/detail/common_iarchive.hpp:66
#5 0x0000000000455bab in boost::archive::basic_text_iarchive<boost::archive::text_iarchive>::load_override<BJShoe*> (this=0x7fffffffdb80, t=@0x6bdcb8: 0x6bd790)
at /usr/include/boost/archive/basic_text_iarchive.hpp:65
#6 0x00000000004558ff in boost::archive::text_iarchive_impl<boost::archive::text_iarchive>::load_override<BJShoe*> (this=0x7fffffffdb80, t=@0x6bdcb8: 0x6bd790)
at /usr/include/boost/archive/text_iarchive.hpp:82
#7 0x00000000004555c0 in boost::archive::detail::interface_iarchive<boost::archive::text_iarchive>::operator>><BJShoe*> (this=0x7fffffffdb80, t=@0x6bdcb8: 0x6bd790)
at /usr/include/boost/archive/detail/interface_iarchive.hpp:60
#8 0x0000000000455209 in boost::serialization::nvp<BJShoe*>::load<boost::archive::text_iarchive> (this=0x7fffffffd000, ar=...) at /usr/include/boost/serialization/nvp.hpp:87
#9 0x0000000000454d72 in boost::serialization::access::member_load<boost::archive::text_iarchive, boost::serialization::nvp<BJShoe*> > (ar=..., t=..., file_version=0)
at /usr/include/boost/serialization/access.hpp:101
#10 0x0000000000454889 in boost::serialization::detail::member_loader<boost::archive::text_iarchive, boost::serialization::nvp<BJShoe*> >::invoke (ar=..., t=..., file_version=0)
at /usr/include/boost/serialization/split_member.hpp:54
#11 0x0000000000454345 in boost::serialization::split_member<boost::archive::text_iarchive, boost::serialization::nvp<BJShoe*> > (ar=..., t=..., file_version=0)
at /usr/include/boost/serialization/split_member.hpp:69
#12 0x0000000000453ce5 in boost::serialization::nvp<BJShoe*>::serialize<boost::archive::text_iarchive> (this=0x7fffffffd000, ar=..., file_version=0)
at /usr/include/boost/serialization/nvp.hpp:89
#13 0x00000000004536c2 in boost::serialization::access::serialize<boost::archive::text_iarchive, boost::serialization::nvp<BJShoe*> > (ar=..., t=..., file_version=0)
at /usr/include/boost/serialization/access.hpp:118
#14 0x00000000004530dc in boost::serialization::serialize<boost::archive::text_iarchive, boost::serialization::nvp<BJShoe*> > (ar=..., t=..., file_version=0)
at /usr/include/boost/serialization/serialization.hpp:69
#15 0x0000000000452a49 in boost::serialization::serialize_adl<boost::archive::text_iarchive, boost::serialization::nvp<BJShoe*> > (ar=..., t=..., file_version=0)
at /usr/include/boost/serialization/serialization.hpp:128
#16 0x00000000004522b1 in boost::archive::detail::load_non_pointer_type<boost::archive::text_iarchive>::load_only::invoke<boost::serialization::nvp<BJShoe*> > (ar=..., t=...)
at /usr/include/boost/archive/detail/iserializer.hpp:373
#17 0x0000000000451a32 in boost::archive::detail::load_non_pointer_type<boost::archive::text_iarchive>::invoke<boost::serialization::nvp<BJShoe*> const> (ar=..., t=...)
at /usr/include/boost/archive/detail/iserializer.hpp:439
#18 0x000000000045111f in boost::archive::load<boost::archive::text_iarchive, boost::serialization::nvp<BJShoe*> const> (ar=..., t=...)
at /usr/include/boost/archive/detail/iserializer.hpp:592
#19 0x000000000045099e in boost::archive::detail::common_iarchive<boost::archive::text_iarchive>::load_override<boost::serialization::nvp<BJShoe*> const> (this=0x7fffffffdb80, t=...)
at /usr/include/boost/archive/detail/common_iarchive.hpp:66
#20 0x00000000004503d5 in boost::archive::basic_text_iarchive<boost::archive::text_iarchive>::load_override<boost::serialization::nvp<BJShoe*> const> (this=0x7fffffffdb80, t=...)
at /usr/include/boost/archive/basic_text_iarchive.hpp:65
#21 0x000000000044fdab in boost::archive::text_iarchive_impl<boost::archive::text_iarchive>::load_override<boost::serialization::nvp<BJShoe*> const> (this=0x7fffffffdb80, t=...)
at /usr/include/boost/archive/text_iarchive.hpp:82
#22 0x000000000044f6f0 in boost::archive::detail::interface_iarchive<boost::archive::text_iarchive>::operator>><boost::serialization::nvp<BJShoe*> const> (this=0x7fffffffdb80, t=...)
at /usr/include/boost/archive/detail/interface_iarchive.hpp:60
#23 0x000000000044e2d3 in boost::archive::detail::interface_iarchive<boost::archive::text_iarchive>::operator&<boost::serialization::nvp<BJShoe*> const> (this=0x7fffffffdb80, t=...)
at /usr/include/boost/archive/detail/interface_iarchive.hpp:67
#24 0x000000000044cc31 in Game::serialize<boost::archive::text_iarchive> (this=0x6bdc60, ar=..., version=1) at Game.h:271
#25 0x000000000044aeee in boost::serialization::access::serialize<boost::archive::text_iarchive, Game> (ar=..., t=..., file_version=1) at /usr/include/boost/serialization/access.hpp:118
#26 0x0000000000449f6b in boost::serialization::serialize<boost::archive::text_iarchive, Game> (ar=..., t=..., file_version=1) at /usr/include/boost/serialization/serialization.hpp:69
#27 0x0000000000447364 in boost::serialization::serialize_adl<boost::archive::text_iarchive, Game> (ar=..., t=..., file_version=1) at /usr/include/boost/serialization/serialization.hpp:128
#28 0x0000000000444677 in boost::archive::detail::iserializer<boost::archive::text_iarchive, Game>::load_object_data (
this=0x6b8090 <boost::serialization::singleton<boost::archive::detail::iserializer<boost::archive::text_iarchive, Game> >::get_instance()::t>, ar=..., x=0x6bdc60, file_version=1)
at /usr/include/boost/archive/detail/iserializer.hpp:188
#29 0x00007ffff7bad852 in load_object (bis=..., t=0x6bdc60, ar=..., this=0x6bd4c0) at libs/serialization/src/basic_iarchive.cpp:362
#30 boost::archive::detail::basic_iarchive::load_object (this=0x7fffffffdb80, t=<optimized out>, bis=...) at libs/serialization/src/basic_iarchive.cpp:537
#31 0x0000000000454e03 in boost::archive::detail::load_non_pointer_type<boost::archive::text_iarchive>::load_standard::invoke<Game> (ar=..., t=...)
at /usr/include/boost/archive/detail/iserializer.hpp:387
#32 0x0000000000454914 in boost::archive::detail::load_non_pointer_type<boost::archive::text_iarchive>::invoke<Game> (ar=..., t=...) at /usr/include/boost/archive/detail/iserializer.hpp:439
#33 0x00000000004543c5 in boost::archive::load<boost::archive::text_iarchive, Game> (ar=..., t=...) at /usr/include/boost/archive/detail/iserializer.hpp:592
#34 0x0000000000453d6e in boost::archive::detail::common_iarchive<boost::archive::text_iarchive>::load_override<Game> (this=0x7fffffffdb80, t=...)
at /usr/include/boost/archive/detail/common_iarchive.hpp:66
#35 0x0000000000453745 in boost::archive::basic_text_iarchive<boost::archive::text_iarchive>::load_override<Game> (this=0x7fffffffdb80, t=...)
我不明白这是否与构造函数或序列化函数有关,因为看起来它正在尝试使用null初始化,对吧?
发现了错误,您必须确定序列化数据时的顺序,保存时的顺序必须与加载数据文件时的顺序相同(对于相同版本的“存档”)。如果对主类使用运算符<<和>>而不是&,而对矢量使用向量而不是本机Classes arrays []会更好,因为boost :: serialization将更好地替换空数据,并且它将调用副本构造函数查找正确的参数。Linux的问题是编译选项。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句