Show
Ignore:
Timestamp:
11/09/10 14:23:43 (3 years ago)
Author:
robert
Message:

Refactored the versioning of serializers so it now uses a _firstVersion and _lastVersion make it possible
to specify what range of versions support each serializer.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgDB/ObjectWrapper.cpp

    r11902 r11903  
    9292} 
    9393 
     94void ObjectWrapper::addSerializer( BaseSerializer* s, BaseSerializer::Type t ) 
     95{ 
     96    s->_firstVersion = _version; 
     97    _serializers.push_back(s); 
     98    _typeList.push_back(static_cast<int>(t)); 
     99} 
     100 
    94101void ObjectWrapper::markSerializerAsRemoved( const std::string& name ) 
    95102{ 
     
    100107        // will thus ignore it according to the sign and value of the _version variable. 
    101108        if ( (*itr)->getName()==name ) 
    102             (*itr)->_version = -_version; 
     109            (*itr)->_lastVersion = _version-1; 
    103110    } 
    104111} 
     
    139146          itr!=_serializers.end(); ++itr ) 
    140147    { 
    141         int serializerVersion = (*itr)->_version; 
    142         if ( serializerVersion!=0 ) 
    143         { 
    144             if ( serializerVersion<0 ) 
     148        BaseSerializer* serializer = itr->get(); 
     149        if ( serializer->_firstVersion <= is.getFileVersion() && 
     150             is.getFileVersion() <= serializer->_lastVersion) 
     151        { 
     152            if ( !serializer->read(is, obj) ) 
    145153            { 
    146                 serializerVersion = -serializerVersion; 
    147                  
    148                 // The serializer is removed from a specified version, 
    149                 // and the file in reading is at the same or higher version, ignore it. 
    150                 if ( is.getFileVersion()>=serializerVersion ) continue; 
     154                OSG_WARN << "ObjectWrapper::read(): Error reading property " 
     155                                    << _name << "::" << (*itr)->getName() << std::endl; 
     156                readOK = false; 
    151157            } 
    152             else 
    153             { 
    154                 // The serializer is added at a specified version, 
    155                 // but the file in reading is at a lower version, ignore it. 
    156                 if ( is.getFileVersion()<serializerVersion ) continue; 
    157             } 
    158         } 
    159          
    160         if ( (*itr)->read(is, obj) ) continue; 
    161         OSG_WARN << "ObjectWrapper::read(): Error reading property " 
    162                                << _name << "::" << (*itr)->getName() << std::endl; 
    163         readOK = false; 
     158        } 
     159        else 
     160        { 
     161            // OSG_NOTICE<<"Ignoring serializer due to version mismatch"<<std::endl; 
     162        } 
    164163    } 
    165164