Workaround for boost serialization bug for NULL shared_ptrs version < 1.66.0

release/4.3a0
Fan Jiang 2019-12-08 00:50:30 -05:00
parent 1b4b292a6e
commit 6d0705c5dc
1 changed files with 37 additions and 5 deletions

View File

@ -25,6 +25,8 @@
#include <gtsam/inference/VariableSlots.h>
#include <boost/make_shared.hpp>
#include <boost/serialization/version.hpp>
#include <boost/serialization/split_member.hpp>
namespace gtsam {
@ -406,13 +408,41 @@ namespace gtsam {
/** Serialization function */
friend class boost::serialization::access;
template<class ARCHIVE>
void serialize(ARCHIVE & ar, const unsigned int /*version*/) {
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
ar & BOOST_SERIALIZATION_NVP(Ab_);
ar & BOOST_SERIALIZATION_NVP(model_);
void save(ARCHIVE & ar, const unsigned int version) const {
// TODO(fan): This is a hack for Boost < 1.66
// We really need to introduce proper versioning in the archives
// As otherwise this will not read objects serialized by older
// versions of GTSAM
ar << BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
ar << BOOST_SERIALIZATION_NVP(Ab_);
bool model_null = false;
if(model_.get() == nullptr) {
model_null = true;
ar << boost::serialization::make_nvp("model_null", model_null);
} else {
ar << boost::serialization::make_nvp("model_null", model_null);
ar << BOOST_SERIALIZATION_NVP(model_);
}
}
}; // JacobianFactor
template<class ARCHIVE>
void load(ARCHIVE & ar, const unsigned int version) {
// invoke serialization of the base class
ar >> BOOST_SERIALIZATION_BASE_OBJECT_NVP(Base);
ar >> BOOST_SERIALIZATION_NVP(Ab_);
if (version < 1) {
ar >> BOOST_SERIALIZATION_NVP(model_);
} else {
bool model_null;
ar >> BOOST_SERIALIZATION_NVP(model_null);
if (!model_null) {
ar >> BOOST_SERIALIZATION_NVP(model_);
}
}
}
BOOST_SERIALIZATION_SPLIT_MEMBER()
}; // JacobianFactor
/// traits
template<>
struct traits<JacobianFactor> : public Testable<JacobianFactor> {
@ -420,6 +450,8 @@ struct traits<JacobianFactor> : public Testable<JacobianFactor> {
} // \ namespace gtsam
BOOST_CLASS_VERSION(gtsam::JacobianFactor, 1)
#include <gtsam/linear/JacobianFactor-inl.h>