Boost logo

Boost Users :

Subject: [Boost-users] using boost serialization with uint64_t, stream error (vista 64bit)
From: emeplease (emeplease_at_[hidden])
Date: 2010-11-28 22:15:09


Hi, I am having difficulties in using boost serialization under
** Windows Vista 64bit **. My boost libraries are built in 64bit. (I
have attached the test program below)

It seems that boost serialization is not able to serialize uint64_t with
maximum value or anything larger then "14757395258967641292", as shown in main() " check_serialization( test64t,
"boost::uint64_t" );"

Also, If I use multiple inheritance, like below, "YYConfig" and "
typedef YYConfig<FakeC, FakeB> MyConfig;" and trying to serialize
"MyConfig" , stream error can occurr.

Thank you very much for your help.

Best Regards,
Joseph

Here is my output

=========== uint32_t ================
succeeded
=========== boost::uint64_t ================
failed
Input : 18446744073709551615
Output : 14757395258967641292

The following will throw exception : stream error
//serialize_and_deserialize( cfg );
Press any key to continue . . .

Test Code
=====================================================================================
#include<iostream>
#include<boost/cstdint.hpp>
#include<boost/archive/text_oarchive.hpp>
#include<boost/archive/text_iarchive.hpp>
#include<sstream>
#include<cstdlib>

using namespace std;

template< class T1, class T2>

struct YYConfig : public T1 , public T2 {
     public:
             friend class boost::serialization::access;
             template<class Archive>
             void serialize(Archive& ar, const unsigned int version) {
                                 ar& boost::serialization::base_object< T1> (*this);
                                 ar& boost::serialization::base_object< T2> (*this);
                }
};

class FakeB
{
public:
        int x;

        FakeB(): x(0){}

        friend class boost::serialization::access;
             template<class Archive>

             void serialize(Archive& ar, const unsigned int version) {
                        ar& x;
                }
};

class FakeC
{
public:
        boost::uint64_t targetNumSamples;
        friend class boost::serialization::access;

        FakeC() : targetNumSamples( std::numeric_limits< boost::uint64_t>::max() ){}

             template<class Archive>
             void serialize(Archive& ar, const unsigned int version) {
                        ar& targetNumSamples;
                }
};

// ======================= Testing ================================/

template<typename T>
T serialize_and_deserialize( T typeValue1 )
{
        T typeValue2;

        // Set
        std::string content;
        std::ostringstream oss;
        {
                boost::archive::text_oarchive oa(oss);
                oa<< typeValue1;
                content = oss.str();
        }

        // Extract
        std::istringstream iss( content );
        {
                boost::archive::text_iarchive ia( iss );
                ia>> typeValue2;
        }

        return typeValue2;
}

template<typename T>
bool check_serialization( T typeValue1, std::string testName )
{
        T typeValue2 = serialize_and_deserialize( typeValue1 );

        std::cout<< std::endl<< "=========== "<< testName<< " ================";

        if( typeValue1 == typeValue2 ){
                std::cout<< std::endl<< "succeeded ";
                return true;
        }
        else{
                std::cout<< std::endl<< "failed ";
                std::cout<< std::endl<< "Input : "<< typeValue1;
                std::cout<< std::endl<< "Output : "<< typeValue2;
                std::cout<< std::endl;
                return false;
        }
}

typedef YYConfig<FakeC, FakeB> MyConfig;

int main(int argc, char** argv )
{
        boost::uint32_t test32t = std::numeric_limits< boost::uint32_t>::max();
        boost::uint64_t test64t = std::numeric_limits< boost::uint64_t>::max();
        
        
        check_serialization( test32t, "uint32_t" );
        check_serialization( test64t, "boost::uint64_t" );

        std::cout<< std::endl<< "The following will throw exception : stream error"<< std::endl ;
        system("pause");

        MyConfig cfg;
        serialize_and_deserialize( cfg );

        return 0;
}



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net