Hi,

 

I have an application that uses serialization for data storage/retrieval, based on Boost 1.67.0. I’ve implemented class versioning as per:

 

https://www.boost.org/doc/libs/1_67_0/libs/serialization/doc/tutorial.html#versioning

 

The overall archive stores a number of sub-classes, nested within the XML. However, I get a run-time exception thrown that I can’t catch when one of my sub-classes (DisplayDefinition) returns from being read in. A bit of debugging found that the problem was caused by the class version number having a value of 0, whilst the file being read had a version number of 3 for the class in question.

 

Here’s the bit of the class responsible for the archiving:

 

class DisplayDefinition: public MessageDefinition

{

...

private:

                friend std::ostream & operator<<(std::ostream &os, const DisplayDefinition &DD);

                friend std::istream & operator>>(std::istream &is, const DisplayDefinition &DD);

                friend class boost::serialization::access;

 

                template<class Archive>

                void serialize(Archive & myArchive, const unsigned int version)

                {

try

{

                const char * cLabelTag = "Label";

myArchive & boost::serialization::make_nvp( cLabelTag, wstrLabel);

const char * cAddressBytesTag = "SysExAddressBytes";

myArchive & boost::serialization::make_nvp( cAddressBytesTag, vSysExAddressBytes);

const char * cActionsTag = "Actions";

myArchive & boost::serialization::make_nvp( cActionsTag, myActions);

const char * cStatesTag = "StateNames";

myArchive & boost::serialization::make_nvp( cStatesTag, StateLabels);

const char * cLineCountTag = "LineCount";

myArchive & boost::serialization::make_nvp( cLineCountTag, nDisplayLineCount);

const char * cLineLengthTag = "LineLength";

myArchive & boost::serialization::make_nvp( cLineLengthTag, nDisplayLength);

const char * cStripCountTag = "StripCount";

myArchive & boost::serialization::make_nvp( cStripCountTag, nStripCount);

const char * cIsLEDLampTag = "LEDLamp";

myArchive & boost::serialization::make_nvp( cIsLEDLampTag, blnIsLEDLamp);

const char * cTranslationTag = "TranslationID";

myArchive & boost::serialization::make_nvp( cTranslationTag, strTranslationID);

const char * cCursorOffsetTag = "CursorOffset";

myArchive & boost::serialization::make_nvp( cCursorOffsetTag, nCursorOffset);

 

if(version > 0)

            {

const char * cCursorFromLeftTag = "CursorFromLeft";

myArchive & boost::serialization::make_nvp( cCursorFromLeftTag, blnCursorFromLeft);

}

 

if(version > 1)

            {

const char * cUniCodeTag = "Unicode";

myArchive & boost::serialization::make_nvp( cUniCodeTag, blnIsUniCode);

}

 

if(version > 2)

            {

const char * cLinkedHashTag = "LinkedTo";

myArchive & boost::serialization::make_nvp( cLinkedHashTag, strLinkedDisplayHash);

}

}  // end try

catch (...)

{

                throw ID_LOAD_DATA_EXCEPTION;

}  // end catch

}

 

...

};  // end of class definition

 

BOOST_CLASS_VERSION(DisplayDefinition, 3);

 

 

I’m clueless as to why the BOOST_CLASS_VERSION macro doesn’t seem to be setting the version number correctly. Can anybody advise me, please?

 

Best wishes.

 

Tim Burgess

Raised Bar Ltd.

E: tim@raisedbar.net

M: +44 (0)7989 486976