Boost logo

Boost Users :

Subject: [Boost-users] Serialization and class versioning
From: tim_at_[hidden]
Date: 2018-08-02 11:58:44


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#v
ersioning

 

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: <mailto:tim_at_[hidden]> tim_at_[hidden]

M: +44 (0)7989 486976

 



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