Boost logo

Boost :

Subject: Re: [boost] [serialization] "stream error" when port fromboost_1.33 toboost_1.36
From: ipangth (ipangth_at_[hidden])
Date: 2008-09-26 03:48:03


Thank you for reminding, the before xml file auto adding cr/lf while
transfering from linux in text mode.
I used the origin xml file to debug in it, and found the prolbem.

in file <basic_xml_iarchive.ipp>
boost_1.33 implimentation is :

template<class Archive>
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
basic_xml_iarchive<Archive>::load_end(const char *name){
    .....

    if(0 != (this->get_flags() & no_xml_tag_checking)){
        // double check that the tag matches what is expected - useful for debug
        if(0 != name[this->This()->gimpl->rv.object_name.size()]
        || ! std::equal(
                this->This()->gimpl->rv.object_name.begin(),
                this->This()->gimpl->rv.object_name.end(),
                name
            )
        ){
            boost::throw_exception(
                archive_exception(archive_exception::stream_error)
            );
        }
    }
}

But in Boost 1.36

template<class Archive>
BOOST_ARCHIVE_OR_WARCHIVE_DECL(void)
basic_xml_iarchive<Archive>::load_end(const char *name){
    .....

    if(0 == (this->get_flags() & no_xml_tag_checking)){
        // double check that the tag matches what is expected - useful for debug
        if(0 != name[this->This()->gimpl->rv.object_name.size()]
        || ! std::equal(
                this->This()->gimpl->rv.object_name.begin(),
                this->This()->gimpl->rv.object_name.end(),
                name
            )
        ){
            boost::throw_exception(
                archive_exception(archive_exception::stream_error)
            );
        }
    }
}

And in my case, this->get_flags() is 0, no_xml_tag_checking is 4,
so (this->get_flags() & no_xml_tag_checking) is false in boost 1.33
and true in boost 1.36,
then the "name" is "t.id", but rv.object_name is "id",
so "0 != name[this->This()->gimpl->rv.object_name.size()" is true,
boost 1.33 no archive_exception but 1.36 throws.

This is the problem. Why boost 1.36 do the check? and why the "name"
and rv.object_name dont match?
And how do id fix it? Modify the boost_1.36 basic_xml_iarchive.ipp
same to boost_1.33?

Here is a xml example text(attach file):
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="3">
<lst_ class_id="0" tracking_level="0" version="0">
        <count>2</count>
        <item class_id="1" tracking_level="0" version="0">
                <id>2</id>
                <host>192.168.21.41</host>
                <port>7100</port>
        </item>
        <item>
                <id>4</id>
                <host>192.168.21.52</host>
                <port>7100</port>
        </item>
</lst_>
</boost_serialization>

        

2008/9/26 Robert Ramey <ramey_at_[hidden]>:
> One odd thing to me is the usage of std::ios::binary which will handle cr/lf
> as two
> characters rather than one.
>
> ipangth wrote:
>>> What are the anomolies?
>>> I debug the xml file with VC8, and the ifstream test retturn
>>> "failbit".
>>> See the xml file attached behind, i dont know how to find the
>>> "failbit".
>>> And some one can see the attach xml to help me?
>>>
>>> template<class CharType>
>>> bool basic_xml_grammar<CharType>::my_parse(
>>> BOOST_DEDUCED_TYPENAME basic_xml_grammar<CharType>::IStream & is,
>>> const rule_t & rule_,
>>> CharType delimiter
>>> ){
>>> if(is.fail()){ ////here return false, the stream state is
>>> "failbit" boost::throw_exception(
>>> archive_exception(archive_exception::stream_error)
>>> );
>>> }
>>>
>>> 2008/9/26 Robert Ramey <ramey_at_[hidden]>:
>>>> Take a look at the xml archive and see if there are any anomolies
>>>> in it.
>>>>
>>>> Robert Ramey
>>>>
>>>> ipangth wrote:
>>>>>> I just port a project using boost_1.33_1 to use boost_1.36.
>>>>>> The project has a Server class using a std::set<Server>
>>>>>> serialization,
>>>>>> the serialization save and load functions code see behind.
>>>>>>
>>>>>> I use gcc 4.1 and run on FC6.
>>>>>> The porting problem is, when the old boost_1.33 generates(save) a
>>>>>> xml file, then use boost_1.36 load the xml throws an exception
>>>>>> "stream error"!
>>>>>>
>>>>>> the exception error code line : boost::archive::xml_iarchive
>>>>>> ia(ifs);
>>>>>>
>>>>>> How can i sovle it?
>>>>>>
>>>>>>
>>>>>> class Server
>>>>>> {
>>>>>> public:
>>>>>> int id;
>>>>>> std::string ip;
>>>>>> int port;
>>>>>>
>>>>>> private:
>>>>>> static std::set<Server> lst_;
>>>>>>
>>>>>> static int dirty_;
>>>>>> };
>>>>>>
>>>>>> #endif
>>>>>>
>>>>>>
>>>>>>
>>>>>> #ifdef USE_SERVER_SERIALIZATION
>>>>>>
>>>>>> #ifndef _SERVER_SERIALIZATION_
>>>>>> #define _SERVER_SERIALIZATION_
>>>>>>
>>>>>> BOOST_CLASS_VERSION(Server, 1)
>>>>>> namespace boost {
>>>>>> namespace serialization {
>>>>>>
>>>>>> template <class archive>
>>>>>> void serialize(archive & ar, Server & t, const unsigned int
>>>>>> ver) {
>>>>>> ar & BOOST_SERIALIZATION_NVP(t.id);
>>>>>> ar & BOOST_SERIALIZATION_NVP(t.ip);
>>>>>> ar & BOOST_SERIALIZATION_NVP(t.port);
>>>>>> }
>>>>>>
>>>>>> }
>>>>>> }
>>>>>>
>>>>>> #endif
>>>>>>
>>>>>> #endif
>>>>>>
>>>>>> int Server::save( const std::string & file)
>>>>>> {
>>>>>> try {
>>>>>> std::ofstream ofs(file.c_str(), std::ios::binary);
>>>>>> {
>>>>>> boost::archive::xml_oarchive oa(ofs);
>>>>>> oa << BOOST_SERIALIZATION_NVP(lst_);
>>>>>> }
>>>>>> } catch(...) {
>>>>>> return ERROR_ERROR;
>>>>>> }
>>>>>>
>>>>>>
>>>>>>
>>>>>> return ERROR_SUCCEED;
>>>>>> }
>>>>>>
>>>>>>
>>>>>> int Server::load(const std::string & file)
>>>>>> {
>>>>>> std::set<Server> Server::lst_;
>>>>>> try
>>>>>> {
>>>>>> std::ifstream ifs(file.c_str(), std::ios::binary);
>>>>>>
>>>>>> {
>>>>>> boost::archive::xml_iarchive ia(ifs);
>>>>>> ia >> BOOST_SERIALIZATION_NVP(lst_);
>>>>>> }
>>>>>> }
>>>>>> catch(std::exception & e)
>>>>>> {
>>>>>> std::cout << e.what() << std::endl;
>>>>>> }
>>>>>>
>>>>>> return 0;
>>>>>> }
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Best regards,
>>>>>> PangYongQiang
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>>> _______________________________________________
>>>>>> Unsubscribe & other changes:
>>>>>> http://lists.boost.org/mailman/listinfo.cgi/boost
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Unsubscribe & other changes:
>>>> http://lists.boost.org/mailman/listinfo.cgi/boost
>>>>
>>>
>>>
>>>
>>> --
>>> Best regards,
>>> PangYongQiang
>>>
>>
>>
>>
>>> _______________________________________________
>>> Unsubscribe & other changes:
>>> http://lists.boost.org/mailman/listinfo.cgi/boost
>
>
>
> _______________________________________________
> Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
>

-- 
Best regards,
PangYongQiang



Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk