Я попытался предоставить геттеры класса A
для моего нечлена serialize()
Функция `, поскольку доступ к членам из них является закрытым.Получить личные данные для неинтрузивного форсирования сериализации C++
template<typename T>
class A
{
public:
A(const T& id) : m_id(id) {}
T& getRef() { return m_id; } // not giving good results
T getId() { return m_id; } // not giving good results
const T& getRef() const { return m_id; } // not giving good results
private: // I would like to keep it private
T m_id;
}
namespace boost { namespace serialization {
template<class Archive,typename T>
void serialize(Archive &ar, A &a, const unsigned int version)
{
// ar &BOOST_SERIALIZATION_NVP(a.m_id); // I would like to avoid that it works if m_id is public
ar &BOOST_SERIALIZATION_NVP(a.GetRef()); // I want this !
}
}}
// and later I use
std::ofstream ofs("test.xml");
boost::archive::xml_oarchive oa(ofs);
A<int> a(42);
oa << BOOST_SERIALIZATION_NVP(a);
К сожалению, исполнение твердит мне uncaught exception of type boost::archive::xml_archive_exception - Invalid XML tag name
, когда я пытаюсь использовать методы получения либо GetRef()
или GetId()
.
Он хорошо работает, если я получаю доступ к m_id
, когда он является общедоступным.
Есть ли хорошие способы сделать это?
Добавлен "Бест-оф-и-миры" подход, который не нарушает инкапсуляцию: ** [Live On Coliru] (http://coliru.stacked-crooked.com/a/5d76b1aa22076a77) **. – sehe
ничего себе. это действительно хороший ответ, предлагающий различные решения со своими плюсами и минусами. Ровно то, что я прыгал;). Спасибо ! Жаль, что я не могу голосовать дважды ... Я дам 1/и 3 / попытку! – coincoin
Как всегда, полный отличный ответ. Кроме того, не прерывая инкапсуляцию и, вероятно, полное нарушение доверия, [этот подход демонстрирует] (http://coliru.stacked-crooked.com/a/4424c219ee37aa20), сериализуя частные переменные-члены. Насколько я могу судить, это соответствует спецификации. Мне, к сожалению, пришлось использовать это при работе с сторонними библиотеками.): –