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.
M: +44 (0)7989 486976