From 6d0705c5dc41031bc3f4a143027dbe09f8d1c48e Mon Sep 17 00:00:00 2001 From: Fan Jiang Date: Sun, 8 Dec 2019 00:50:30 -0500 Subject: [PATCH] Workaround for boost serialization bug for NULL shared_ptrs version < 1.66.0 --- gtsam/linear/JacobianFactor.h | 42 ++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/gtsam/linear/JacobianFactor.h b/gtsam/linear/JacobianFactor.h index c8d77c554..53ce4b9ca 100644 --- a/gtsam/linear/JacobianFactor.h +++ b/gtsam/linear/JacobianFactor.h @@ -25,6 +25,8 @@ #include #include +#include +#include namespace gtsam { @@ -406,13 +408,41 @@ namespace gtsam { /** Serialization function */ friend class boost::serialization::access; template - 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 + 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 : public Testable { @@ -420,6 +450,8 @@ struct traits : public Testable { } // \ namespace gtsam +BOOST_CLASS_VERSION(gtsam::JacobianFactor, 1) + #include