Hi, Could someone please help me to better understand how to write serialization functions for a class using type erasure? Looking at my code, and at the hpx/runtime/serialization/ code, I just can't figure out how to handle this. Even assuming that the boilerplate code is able to correctly deal with pointers to a derived class, it appears to me that only the serialize function for the base class will be executed by the runtime system.

## Advertising

Perhaps I don't understand how the underlying serialization subsystem works in HPX, but it would seem to me that there should be *something* particular that needs to be done in my code to be able to properly handle this situation. I suspect that this is the latest cause of segmentation faults that I'm having on my project... The classes in question look something like the following. I think that the code is fairly straightforward - the Model class is essentially a wrapper for a variety of concrete model types: first an object of concrete model type is created and then passed to Model::Construct(Model_Type) which returns a Model wrapper object. This Model type is required as a parameter for some of my Components -- as such, these classes all need to support serialization. class Model{ private: std::unique_ptr<detail::Model_Base> impl_; public: Model(std::unique_ptr<detail::Model_Base>&& model_ptr ) : implex_(std::move(model_ptr>){} Model() = default; Model(Model&& other) = default; Model(Model const& other) : impl(other.impl_->Clone()){} template <typename Model_Type> static Model Construct(Model_Type const& model){ std::unique_ptr<detail::Model_Base> model_impl_ = std::make_unique<detail::Model_Impl<Model_Type>>(model); Model model_{std::move(model_impl_)}; return model_; /* ... */ private: friend class hpx::serialization::access; template <typename Archive> void serialize(Archive& ar, const unsigned int version){ ar & impl_; } }; namespace detail{ struct Model_Base { virtual Matrix Model(Matrix const &inputdata, vector<Matrix> parameters); /* ... */ virtual fx::modeling::detail::Model_Base *Clone(); private: friend class hpx::serialization::access; protected: template <typename Archive> void serialize(Archive& ar, const unsigned int version){} } template <typename Model_Type> struct Model_Impl : public Model_Base { public: using model_type = Model_Type; Model_Impl(Model_Type model) : model_(model) {} Model_Impl(Model_Impl const &other) : model_(other.model_) {} Model_Impl(Model_Impl &&other) = default; Matrix Evaluate_Model(Matrix const &inputdata, vector<Matrix> parameters) override; /* ... */ virtual fx::modeling::detail::Model_Base *Clone() override; private: Model_Type model_; friend class hpx::serialization::access; template <typename Archive> void serialize(Archive& ar, const unsigned int version){ ar & model_; } }; As usual, I greatly appreciate any help that you can offer. Just a final note -- as this is for a personal project, I have flexibility in changing things fairly broadly. If the above approach is wrong or problematic, I would also appreciate any suggestions on how to better handle this. Thanks and regards, Michael _______________________________________________ hpx-users mailing list hpx-users@stellar.cct.lsu.edu https://mail.cct.lsu.edu/mailman/listinfo/hpx-users