
Hi, I need serialization in a project of mine. I have reduced my options to boost and ProtocolBuffer, but in order to be able to decide which one to use, I am trying to build a timing test for serialization and deserialization. Let me explain a little about my setup: a) Platform: - windows 7, 64bit version - visual studio 2008 express edition x32 b) Additional library: - ACE library for High resolution timer. The code (an explanations) that I have used to implement the comparison is at follows: I build a class with four different lists of boost/serialization/list like documentation states: std::list<unsigned int> &lint_; std::list<ACE_INT64> &llong_; std::list<float> &lfloat_; std::list<std::string> &lstring_; The test is increasing the size of every list simultaneously. Then it gets serializated and deserializated and finally I get the time results for this process. However there is one issue: Serialization always works, but deserialization fails during execution time whenever the lists are bigger than 10 elements, throws a exception "input stream error" into boost/serialization/throw_exception.hpp as seen with the debugger in the variable/const std::exception const &e (boost library) Visual studio shows this message: Unhandled exception at 0x765cb727 in prTestBoostSerialization2.exe: Microsoft C++ exception: boost::archive::archive_exception at memory location 0x003fc564.. my class definition is: #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> #include <boost/serialization/string.hpp> #include <boost/serialization/list.hpp> //#include <boost/serialization/version.hpp> //#include <boost/serialization/split_member.hpp> #include <iostream> #include <list> #include <string> class BoostSerializationClass { public: // Not required because al member are public // friend class boost::serialization::access; BoostSerializationClass(std::list<unsigned int> &lint , std::list<float> &lfloat , std::list<ACE_INT64> &llong , std::list<std::string> &lstring) : lint_(lint), lfloat_(lfloat), llong_(llong), lstring_(lstring) { //std::cout << std::endl << " max size " << lint_.max_size(); //std::cout << std::endl << " " << llong_.max_size(); //std::cout << std::endl << " " << lfloat_.max_size(); //std::cout << std::endl << " " << lstring_.max_size(); } std::list<unsigned int> &lint_; std::list<ACE_INT64> &llong_; std::list<float> &lfloat_; std::list<std::string> &lstring_; }; namespace boost { namespace serialization { template<class Archive> void serialize(Archive &ar, BoostSerializationClass &c , const unsigned int version){ ar & c.lint_; ar & c.llong_; ar & c.lfloat_; ar & c.lstring_; } } } ----------------------- And main function is: #include <iostream> #include <fstream> //#include <cstdlib> #include <ace/OS.h> #include <ace/Time_Value.h> #include <ace/High_Res_Timer.h> // high resolution timer // include for BOOST #include "../prTestProtocolBuffers/BoostSerializationClass.h" #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> //#include <list> <- dont include this use boost/serialization/list #include <boost/serialization/list.hpp> void gen_random_string(std::string &s, const int len); int ACE_TMAIN(int argc, ACE_TCHAR* argv[]){ //int lengthList = 5; //int lengthList = 10; int lengthList = 15; //int lengthList = 50; // int lengthList = 100; // int lengthList = 1000; std::list<unsigned int> listInteger,listInteger2; std::list<float> listFloat,listFloat2; std::list<ACE_INT64> listLongs,listLongs2; std::list<std::string> listString,listString2; int rint = 0; float rfloat = 0.f; ACE_INT64 rint64 = 0; std::string rstring = ""; std::cout << std::endl << "Begin random generate message. Please be patient."; // Generate random fields for messages for (int i=0 ; i<lengthList ; i++){ listInteger.push_back( rand() ); listFloat.push_back( (float)rand()/(float)RAND_MAX ); listLongs.push_back( rand()*rand()*rand() ); gen_random_string(rstring, lengthList); listString.push_back( rstring ); } // BOOST SERIALIZATION ACE_High_Res_Timer hrTimerBoost; // Load fields into BoostSerializableClass BoostSerializationClass boostSerializationClass( listInteger, listFloat, listLongs, listString); std::ofstream obfile("boost-file.bin"); boost::archive::binary_oarchive oba(obfile); //ACE_Time_Value btvStart = ACE_OS::gettimeofday(); hrTimerBoost.start(); oba & boostSerializationClass; // boost serialization; obfile.close(); hrTimerBoost.stop(); ACE_hrtime_t usecsBoost; hrTimerBoost.elapsed_microseconds(usecsBoost); //ACE_Time_Value btvEnd = ACE_OS::gettimeofday(); //ACE_Time_Value tvIncBoost( btvEnd.sec() - btvStart.sec() , btvEnd.msec() - btvStart.msec() ); std::cout << std:: endl << " ===== BOOST SERIALIZATION =====" ; //std::cout << std::endl << tvIncBoost.sec() << " seconds " << tvIncBoost.msec() << " mseconds" << std::endl ; std::cout << std::endl << usecsBoost << " micro seconds " << std::endl ; // BOOST DESERIALIZACION BoostSerializationClass boostSerializationClass2( listInteger2, listFloat2, listLongs2, listString2); std::ifstream ibfile("boost-file.bin"); boost::archive::binary_iarchive iba(ibfile); //btvStart = ACE_OS::gettimeofday(); hrTimerBoost.reset(); hrTimerBoost.start(); iba & boostSerializationClass2; ibfile.close(); hrTimerBoost.stop(); hrTimerBoost.elapsed_microseconds(usecsBoost); //btvEnd = ACE_OS::gettimeofday(); //tvIncBoost = ACE_Time_Value( btvEnd.sec() - btvStart.sec() , btvEnd.msec() - btvStart.msec() ); std::cout << std:: endl << " ===== BOOST DE-SERIALIZATION =====" ; //std::cout << std::endl << tvIncBoost.sec() << " seconds " << tvIncBoost.msec() << " mseconds" << std::endl ; std::cout << std::endl << usecsBoost << " micro seconds " << std::endl ; ACE_OS::system("pause"); return 0; } //////////////////////////////////////////////////////////////////////////////////////////////////////////// void gen_random_string(std::string &s, const int len) { static const char alphanum[] = "0123456789" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"; s.clear(); for (int i = 0; i < len ; ++i) { s.push_back(rand() % (sizeof(alphanum) - 1) ); } } Can anyone of you help me with this? Any help would be truly appreciated. Thanks in advance.

This stirred a vague memory of something like this that happened to me. Should you not be specifying binary ios flag when you open the filestream (both for reading and writing, but you will only see the error reading). Without this you get a bizarre failure after the first linefeed character gets extended to cr lf pair. It looks like it is a problem with archive capacity, but it just depends on when the first character 13 is sent. I remember I spent hours staring at the code without seeing the problem I could easily be wrong, but worth checking your code. On Tue, Nov 9, 2010 at 7:30 PM, Esteban RG <stbnrivas@gmail.com> wrote:
Hi, I need serialization in a project of mine. I have reduced my options to boost and ProtocolBuffer, but in order to be able to decide which one to use, I am trying to build a timing test for serialization and deserialization. Let me explain a little about my setup: a) Platform: - windows 7, 64bit version - visual studio 2008 express edition x32
b) Additional library: - ACE library for High resolution timer.
The code (an explanations) that I have used to implement the comparison is at follows:
I build a class with four different lists of boost/serialization/list like documentation states:
std::list<unsigned int> &lint_; std::list<ACE_INT64> &llong_; std::list<float> &lfloat_; std::list<std::string> &lstring_;
The test is increasing the size of every list simultaneously. Then it gets serializated and deserializated and finally I get the time results for this process. However there is one issue: Serialization always works, but deserialization fails during execution time whenever the lists are bigger than 10 elements, throws a exception "input stream error" into boost/serialization/throw_exception.hpp as seen with the debugger in the variable/const std::exception const &e (boost library)
Visual studio shows this message: Unhandled exception at 0x765cb727 in prTestBoostSerialization2.exe: Microsoft C++ exception: boost::archive::archive_exception at memory location 0x003fc564..
my class definition is:
#include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/string.hpp> #include <boost/serialization/list.hpp> //#include <boost/serialization/version.hpp> //#include <boost/serialization/split_member.hpp>
#include <iostream> #include <list> #include <string>
class BoostSerializationClass { public:
// Not required because al member are public // friend class boost::serialization::access;
BoostSerializationClass(std::list<unsigned int> &lint , std::list<float> &lfloat , std::list<ACE_INT64> &llong , std::list<std::string> &lstring) : lint_(lint), lfloat_(lfloat), llong_(llong), lstring_(lstring) { //std::cout << std::endl << " max size " << lint_.max_size(); //std::cout << std::endl << " " << llong_.max_size(); //std::cout << std::endl << " " << lfloat_.max_size(); //std::cout << std::endl << " " << lstring_.max_size(); }
std::list<unsigned int> &lint_; std::list<ACE_INT64> &llong_; std::list<float> &lfloat_; std::list<std::string> &lstring_; };
namespace boost { namespace serialization { template<class Archive> void serialize(Archive &ar, BoostSerializationClass &c , const unsigned int version){ ar & c.lint_; ar & c.llong_; ar & c.lfloat_; ar & c.lstring_; } } }
----------------------- And main function is:
#include <iostream> #include <fstream>
//#include <cstdlib> #include <ace/OS.h> #include <ace/Time_Value.h> #include <ace/High_Res_Timer.h> // high resolution timer
// include for BOOST #include "../prTestProtocolBuffers/BoostSerializationClass.h" #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> //#include <list> <- dont include this use boost/serialization/list #include <boost/serialization/list.hpp>
void gen_random_string(std::string &s, const int len);
int ACE_TMAIN(int argc, ACE_TCHAR* argv[]){
//int lengthList = 5; //int lengthList = 10; int lengthList = 15; //int lengthList = 50; // int lengthList = 100; // int lengthList = 1000;
std::list<unsigned int> listInteger,listInteger2; std::list<float> listFloat,listFloat2; std::list<ACE_INT64> listLongs,listLongs2; std::list<std::string> listString,listString2;
int rint = 0; float rfloat = 0.f; ACE_INT64 rint64 = 0; std::string rstring = "";
std::cout << std::endl << "Begin random generate message. Please be patient."; // Generate random fields for messages for (int i=0 ; i<lengthList ; i++){ listInteger.push_back( rand() ); listFloat.push_back( (float)rand()/(float)RAND_MAX ); listLongs.push_back( rand()*rand()*rand() ); gen_random_string(rstring, lengthList); listString.push_back( rstring ); }
// BOOST SERIALIZATION ACE_High_Res_Timer hrTimerBoost;
// Load fields into BoostSerializableClass BoostSerializationClass boostSerializationClass( listInteger, listFloat, listLongs, listString);
std::ofstream obfile("boost-file.bin"); boost::archive::binary_oarchive oba(obfile); //ACE_Time_Value btvStart = ACE_OS::gettimeofday(); hrTimerBoost.start(); oba & boostSerializationClass; // boost serialization; obfile.close(); hrTimerBoost.stop();
ACE_hrtime_t usecsBoost; hrTimerBoost.elapsed_microseconds(usecsBoost); //ACE_Time_Value btvEnd = ACE_OS::gettimeofday(); //ACE_Time_Value tvIncBoost( btvEnd.sec() - btvStart.sec() , btvEnd.msec() - btvStart.msec() ); std::cout << std:: endl << " ===== BOOST SERIALIZATION =====" ; //std::cout << std::endl << tvIncBoost.sec() << " seconds " << tvIncBoost.msec() << " mseconds" << std::endl ; std::cout << std::endl << usecsBoost << " micro seconds " << std::endl ;
// BOOST DESERIALIZACION BoostSerializationClass boostSerializationClass2( listInteger2, listFloat2, listLongs2, listString2); std::ifstream ibfile("boost-file.bin"); boost::archive::binary_iarchive iba(ibfile); //btvStart = ACE_OS::gettimeofday(); hrTimerBoost.reset(); hrTimerBoost.start(); iba & boostSerializationClass2; ibfile.close(); hrTimerBoost.stop();
hrTimerBoost.elapsed_microseconds(usecsBoost); //btvEnd = ACE_OS::gettimeofday(); //tvIncBoost = ACE_Time_Value( btvEnd.sec() - btvStart.sec() , btvEnd.msec() - btvStart.msec() ); std::cout << std:: endl << " ===== BOOST DE-SERIALIZATION =====" ; //std::cout << std::endl << tvIncBoost.sec() << " seconds " << tvIncBoost.msec() << " mseconds" << std::endl ; std::cout << std::endl << usecsBoost << " micro seconds " << std::endl ;
ACE_OS::system("pause"); return 0; }
//////////////////////////////////////////////////////////////////////////////////////////////////////////// void gen_random_string(std::string &s, const int len) { static const char alphanum[] = "0123456789" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"; s.clear(); for (int i = 0; i < len ; ++i) { s.push_back(rand() % (sizeof(alphanum) - 1) ); } }
Can anyone of you help me with this? Any help would be truly appreciated.
Thanks in advance. _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 In writing performance tests for xml serialization, similiar in nature to your code, I seem to recall running into issues similiar to yours and Paul's; I also seem to recall Paul's suggested solution solved my issues. On Wed, 10 Nov 2010 00:57:06 +0000 Paul Blampspied <elpidiovaldez5@gmail.com> wrote:
This stirred a vague memory of something like this that happened to me. Should you not be specifying binary ios flag when you open the filestream (both for reading and writing, but you will only see the error reading). Without this you get a bizarre failure after the first linefeed character gets extended to cr lf pair. It looks like it is a problem with archive capacity, but it just depends on when the first character 13 is sent. I remember I spent hours staring at the code without seeing the problem I could easily be wrong, but worth checking your code.
On Tue, Nov 9, 2010 at 7:30 PM, Esteban RG <stbnrivas@gmail.com> wrote:
Hi, I need serialization in a project of mine. I have reduced my options to boost and ProtocolBuffer, but in order to be able to decide which one to use, I am trying to build a timing test for serialization and deserialization. Let me explain a little about my setup: a) Platform: - windows 7, 64bit version - visual studio 2008 express edition x32
b) Additional library: - ACE library for High resolution timer.
The code (an explanations) that I have used to implement the comparison is at follows:
I build a class with four different lists of boost/serialization/list like documentation states:
std::list<unsigned int> &lint_; std::list<ACE_INT64> &llong_; std::list<float> &lfloat_; std::list<std::string> &lstring_;
The test is increasing the size of every list simultaneously. Then it gets serializated and deserializated and finally I get the time results for this process. However there is one issue: Serialization always works, but deserialization fails during execution time whenever the lists are bigger than 10 elements, throws a exception "input stream error" into boost/serialization/throw_exception.hpp as seen with the debugger in the variable/const std::exception const &e (boost library)
Visual studio shows this message: Unhandled exception at 0x765cb727 in prTestBoostSerialization2.exe: Microsoft C++ exception: boost::archive::archive_exception at memory location 0x003fc564..
my class definition is:
#include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/string.hpp> #include <boost/serialization/list.hpp> //#include <boost/serialization/version.hpp> //#include <boost/serialization/split_member.hpp>
#include <iostream> #include <list> #include <string>
class BoostSerializationClass { public:
// Not required because al member are public // friend class boost::serialization::access;
BoostSerializationClass(std::list<unsigned int> &lint , std::list<float> &lfloat , std::list<ACE_INT64> &llong , std::list<std::string> &lstring) : lint_(lint), lfloat_(lfloat), llong_(llong), lstring_(lstring) { //std::cout << std::endl << " max size " << lint_.max_size(); //std::cout << std::endl << " " << llong_.max_size(); //std::cout << std::endl << " " << lfloat_.max_size(); //std::cout << std::endl << " " << lstring_.max_size(); }
std::list<unsigned int> &lint_; std::list<ACE_INT64> &llong_; std::list<float> &lfloat_; std::list<std::string> &lstring_; };
namespace boost { namespace serialization { template<class Archive> void serialize(Archive &ar, BoostSerializationClass &c , const unsigned int version){ ar & c.lint_; ar & c.llong_; ar & c.lfloat_; ar & c.lstring_; } } }
----------------------- And main function is:
#include <iostream> #include <fstream>
//#include <cstdlib> #include <ace/OS.h> #include <ace/Time_Value.h> #include <ace/High_Res_Timer.h> // high resolution timer
// include for BOOST #include "../prTestProtocolBuffers/BoostSerializationClass.h" #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> //#include <list> <- dont include this use boost/serialization/list #include <boost/serialization/list.hpp>
void gen_random_string(std::string &s, const int len);
int ACE_TMAIN(int argc, ACE_TCHAR* argv[]){
//int lengthList = 5; //int lengthList = 10; int lengthList = 15; //int lengthList = 50; // int lengthList = 100; // int lengthList = 1000;
std::list<unsigned int> listInteger,listInteger2; std::list<float> listFloat,listFloat2; std::list<ACE_INT64> listLongs,listLongs2; std::list<std::string> listString,listString2;
int rint = 0; float rfloat = 0.f; ACE_INT64 rint64 = 0; std::string rstring = "";
std::cout << std::endl << "Begin random generate message. Please be patient."; // Generate random fields for messages for (int i=0 ; i<lengthList ; i++){ listInteger.push_back( rand() ); listFloat.push_back( (float)rand()/(float)RAND_MAX ); listLongs.push_back( rand()*rand()*rand() ); gen_random_string(rstring, lengthList); listString.push_back( rstring ); }
// BOOST SERIALIZATION ACE_High_Res_Timer hrTimerBoost;
// Load fields into BoostSerializableClass BoostSerializationClass boostSerializationClass( listInteger, listFloat, listLongs, listString);
std::ofstream obfile("boost-file.bin"); boost::archive::binary_oarchive oba(obfile); //ACE_Time_Value btvStart = ACE_OS::gettimeofday(); hrTimerBoost.start(); oba & boostSerializationClass; // boost serialization; obfile.close(); hrTimerBoost.stop();
ACE_hrtime_t usecsBoost; hrTimerBoost.elapsed_microseconds(usecsBoost); //ACE_Time_Value btvEnd = ACE_OS::gettimeofday(); //ACE_Time_Value tvIncBoost( btvEnd.sec() - btvStart.sec() , btvEnd.msec() - btvStart.msec() ); std::cout << std:: endl << " ===== BOOST SERIALIZATION =====" ; //std::cout << std::endl << tvIncBoost.sec() << " seconds " << tvIncBoost.msec() << " mseconds" << std::endl ; std::cout << std::endl << usecsBoost << " micro seconds " << std::endl ;
// BOOST DESERIALIZACION BoostSerializationClass boostSerializationClass2( listInteger2, listFloat2, listLongs2, listString2); std::ifstream ibfile("boost-file.bin"); boost::archive::binary_iarchive iba(ibfile); //btvStart = ACE_OS::gettimeofday(); hrTimerBoost.reset(); hrTimerBoost.start(); iba & boostSerializationClass2; ibfile.close(); hrTimerBoost.stop();
hrTimerBoost.elapsed_microseconds(usecsBoost); //btvEnd = ACE_OS::gettimeofday(); //tvIncBoost = ACE_Time_Value( btvEnd.sec() - btvStart.sec() , btvEnd.msec() - btvStart.msec() ); std::cout << std:: endl << " ===== BOOST DE-SERIALIZATION =====" ; //std::cout << std::endl << tvIncBoost.sec() << " seconds " << tvIncBoost.msec() << " mseconds" << std::endl ; std::cout << std::endl << usecsBoost << " micro seconds " << std::endl ;
ACE_OS::system("pause"); return 0; }
//////////////////////////////////////////////////////////////////////////////////////////////////////////// void gen_random_string(std::string &s, const int len) { static const char alphanum[] = "0123456789" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"; s.clear(); for (int i = 0; i < len ; ++i) { s.push_back(rand() % (sizeof(alphanum) - 1) ); } }
Can anyone of you help me with this? Any help would be truly appreciated.
Thanks in advance. _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
- -- Bryce Lelbach aka wash http://groups.google.com/group/ariel_devel -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) iEYEARECAAYFAkzaJFQACgkQO/fqqIuE2t4qwgCgjecpWrtw+AZv3eaqw6HGbFnu LVkAoIdQLm+KKHGCo5sGwjrkjcMNwXd9 =0gAA -----END PGP SIGNATURE-----

Bryce Lelbach wrote:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
In writing performance tests for xml serialization, similiar in nature to your code, I seem to recall running into issues
[snip]
On Wed, 10 Nov 2010 00:57:06 +0000 Paul Blampspied <elpidiovaldez5@gmail.com> wrote:
This stirred a vague memory of something like this that happened to me. Should you not be specifying binary ios flag when you open the filestream (both for reading and writing, but you will only see the error reading). [snip]
On Tue, Nov 9, 2010 at 7:30 PM, Esteban RG <stbnrivas@gmail.com> wrote:
[snip OP's entire post, including signature]
Bryce and Paul, please don't top post and don't overquote. <http://www.boost.org/community/policy.html#quoting> _____ Rob Stewart robert.stewart@sig.com Software Engineer, Core Software using std::disclaimer; Susquehanna International Group, LLP http://www.sig.com IMPORTANT: The information contained in this email and/or its attachments is confidential. If you are not the intended recipient, please notify the sender immediately by reply and immediately delete this message and all its attachments. Any review, use, reproduction, disclosure or dissemination of this message or any attachment by an unintended recipient is strictly prohibited. Neither this message nor any attachment is intended as or should be construed as an offer, solicitation or recommendation to buy or sell any security or other financial instrument. Neither the sender, his or her employer nor any of their respective affiliates makes any warranties as to the completeness or accuracy of any of the information contained herein or that this message or any of its attachments is free of viruses.

Hi again, thank you to Paul and Bryce for our responses, i apreciated so much your help, sorry for lag in response. Fix code are between below lines. Thanks On 10 November 2010 01:57, Paul Blampspied <elpidiovaldez5@gmail.com> wrote:
This stirred a vague memory of something like this that happened to me. Should you not be specifying binary ios flag when you open the filestream (both for reading and writing, but you will only see the error reading).
Thank you to both, Paul and Bryce this works, I change the code like that: ... // Boost serialization BoostSerializationClass boostSerializationClass( listInteger, listFloat, listLongs, listString); //std::ofstream obfile("boost-file.bin"); // <- this line cause fail std::ofstream obfile("boost-file.bin", std::ios::binary ); // replace for this boost::archive::binary_oarchive oba(obfile); ... ... // Boost deserialization BoostSerializationClass boostSerializationClass2( listInteger2, listFloat2, listLongs2, listString2); //std::ifstream ibfile("boost-file.bin"); // <- this line cause fail std::ifstream ibfile("boost-file.bin",std::ios::binary); // replace for this boost::archive::binary_iarchive iba(ibfile); ...
Without this you get a bizarre failure after the first linefeed character gets extended to cr lf pair. It looks like it is a problem with archive capacity, but it just depends on when the first character 13 is sent. I remember I spent hours staring at the code without seeing the problem I could easily be wrong, but worth checking your code.
On Tue, Nov 9, 2010 at 7:30 PM, Esteban RG <stbnrivas@gmail.com> wrote:
Hi, I need serialization in a project of mine. I have reduced my options to boost and ProtocolBuffer, but in order to be able to decide which one to use, I am trying to build a timing test for serialization and deserialization. Let me explain a little about my setup: a) Platform: - windows 7, 64bit version - visual studio 2008 express edition x32
b) Additional library: - ACE library for High resolution timer.
The code (an explanations) that I have used to implement the comparison is at follows:
I build a class with four different lists of boost/serialization/list like documentation states:
std::list<unsigned int> &lint_; std::list<ACE_INT64> &llong_; std::list<float> &lfloat_; std::list<std::string> &lstring_;
The test is increasing the size of every list simultaneously. Then it gets serializated and deserializated and finally I get the time results for this process. However there is one issue: Serialization always works, but deserialization fails during execution time whenever the lists are bigger than 10 elements, throws a exception "input stream error" into boost/serialization/throw_exception.hpp as seen with the debugger in the variable/const std::exception const &e (boost library)
Visual studio shows this message: Unhandled exception at 0x765cb727 in prTestBoostSerialization2.exe: Microsoft C++ exception: boost::archive::archive_exception at memory location 0x003fc564..
my class definition is:
#include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/string.hpp> #include <boost/serialization/list.hpp> //#include <boost/serialization/version.hpp> //#include <boost/serialization/split_member.hpp>
#include <iostream> #include <list> #include <string>
class BoostSerializationClass { public:
// Not required because al member are public // friend class boost::serialization::access;
BoostSerializationClass(std::list<unsigned int> &lint , std::list<float> &lfloat , std::list<ACE_INT64> &llong , std::list<std::string> &lstring) : lint_(lint), lfloat_(lfloat), llong_(llong), lstring_(lstring) { //std::cout << std::endl << " max size " << lint_.max_size(); //std::cout << std::endl << " " << llong_.max_size(); //std::cout << std::endl << " " << lfloat_.max_size(); //std::cout << std::endl << " " << lstring_.max_size(); }
std::list<unsigned int> &lint_; std::list<ACE_INT64> &llong_; std::list<float> &lfloat_; std::list<std::string> &lstring_; };
namespace boost { namespace serialization { template<class Archive> void serialize(Archive &ar, BoostSerializationClass &c , const unsigned int version){ ar & c.lint_; ar & c.llong_; ar & c.lfloat_; ar & c.lstring_; } } }
----------------------- And main function is:
#include <iostream> #include <fstream>
//#include <cstdlib> #include <ace/OS.h> #include <ace/Time_Value.h> #include <ace/High_Res_Timer.h> // high resolution timer
// include for BOOST #include "../prTestProtocolBuffers/BoostSerializationClass.h" #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> //#include <list> <- dont include this use boost/serialization/list #include <boost/serialization/list.hpp>
void gen_random_string(std::string &s, const int len);
int ACE_TMAIN(int argc, ACE_TCHAR* argv[]){
//int lengthList = 5; //int lengthList = 10; int lengthList = 15; //int lengthList = 50; // int lengthList = 100; // int lengthList = 1000;
std::list<unsigned int> listInteger,listInteger2; std::list<float> listFloat,listFloat2; std::list<ACE_INT64> listLongs,listLongs2; std::list<std::string> listString,listString2;
int rint = 0; float rfloat = 0.f; ACE_INT64 rint64 = 0; std::string rstring = "";
std::cout << std::endl << "Begin random generate message. Please be patient."; // Generate random fields for messages for (int i=0 ; i<lengthList ; i++){ listInteger.push_back( rand() ); listFloat.push_back( (float)rand()/(float)RAND_MAX ); listLongs.push_back( rand()*rand()*rand() ); gen_random_string(rstring, lengthList); listString.push_back( rstring ); }
// BOOST SERIALIZATION ACE_High_Res_Timer hrTimerBoost;
// Load fields into BoostSerializableClass BoostSerializationClass boostSerializationClass( listInteger, listFloat, listLongs, listString);
std::ofstream obfile("boost-file.bin"); boost::archive::binary_oarchive oba(obfile); //ACE_Time_Value btvStart = ACE_OS::gettimeofday(); hrTimerBoost.start(); oba & boostSerializationClass; // boost serialization; obfile.close(); hrTimerBoost.stop();
ACE_hrtime_t usecsBoost; hrTimerBoost.elapsed_microseconds(usecsBoost); //ACE_Time_Value btvEnd = ACE_OS::gettimeofday(); //ACE_Time_Value tvIncBoost( btvEnd.sec() - btvStart.sec() , btvEnd.msec() - btvStart.msec() ); std::cout << std:: endl << " ===== BOOST SERIALIZATION =====" ; //std::cout << std::endl << tvIncBoost.sec() << " seconds " << tvIncBoost.msec() << " mseconds" << std::endl ; std::cout << std::endl << usecsBoost << " micro seconds " << std::endl ;
// BOOST DESERIALIZACION BoostSerializationClass boostSerializationClass2( listInteger2, listFloat2, listLongs2, listString2); std::ifstream ibfile("boost-file.bin"); boost::archive::binary_iarchive iba(ibfile); //btvStart = ACE_OS::gettimeofday(); hrTimerBoost.reset(); hrTimerBoost.start(); iba & boostSerializationClass2; ibfile.close(); hrTimerBoost.stop();
hrTimerBoost.elapsed_microseconds(usecsBoost); //btvEnd = ACE_OS::gettimeofday(); //tvIncBoost = ACE_Time_Value( btvEnd.sec() - btvStart.sec() , btvEnd.msec() - btvStart.msec() ); std::cout << std:: endl << " ===== BOOST DE-SERIALIZATION =====" ; //std::cout << std::endl << tvIncBoost.sec() << " seconds " << tvIncBoost.msec() << " mseconds" << std::endl ; std::cout << std::endl << usecsBoost << " micro seconds " << std::endl ;
ACE_OS::system("pause"); return 0; }
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void gen_random_string(std::string &s, const int len) { static const char alphanum[] = "0123456789" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz"; s.clear(); for (int i = 0; i < len ; ++i) { s.push_back(rand() % (sizeof(alphanum) - 1) ); } }
Can anyone of you help me with this? Any help would be truly appreciated.
Thanks in advance. _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
participants (4)
-
Bryce Lelbach
-
Esteban RG
-
Paul Blampspied
-
Stewart, Robert