Я пытаюсь использовать boost::serialization для замены одной части существующего проекта, который реализует свои собственные методы сериализации, но не так хорош. Однако я столкнулся с некоторыми проблемами, потому что приложение использует MFC. Я попытался сериализовать CString следующим образом
template<class Archive>
void save(Archive & ar, CString & s, const unsigned int version) {
using boost::serialization::make_nvp;
const std::basic_string<TCHAR> ss((LPCTSTR)s);
ar & make_nvp("String", ss);
}
template<class Archive>
void load(Archive & ar, CString & s, const unsigned int version) {
using boost::serialization::make_nvp;
std::string ss;
ar & make_nvp("String",ss);
s = ss.c_str;
}
Но я получаю некоторые ошибки
boost
45_0\boost\serialization\access.hpp(118): ошибка C2039: 'serialize': не является членом 'ATL::CStringT'template<class Archive> void save(Archive & ar, CString & s, const unsigned int version) { using boost::serialization::make_nvp; const std::basic_string<TCHAR> ss((LPCTSTR)s); ar & make_nvp("String", ss); } template<class Archive> void load(Archive & ar, CString & s, const unsigned int version) { using boost::serialization::make_nvp; std::string ss; ar & make_nvp("String",ss); s = ss.c_str; }
В access.hpp написано
// note: if you get a compile time error here with a // message something like: // cannot convert parameter 1 from <file type 1> to <file type 2 &> // a likely possible cause is that the class T contains a // serialize function - but that serialize function isn't // a template and corresponds to a file type different than // the class Archive. To resolve this, don't include an // archive type other than that for which the serialization // function is defined!!!
Итак, я предполагаю, что CString имеет некоторую сериализацию из-за MFC.
Теперь мне интересно, что я могу сделать? Есть ли обходной путь? Я пытаюсь избежать переопределения CStrings в std:string, потому что их так много, что это подразумевает переделку всего проекта.
Кроме того, я хочу сериализовать CArray, но получаю тот же тип ошибки, что сериализация не является членом CArray.
EDIT: Проблема с CString устранена путем добавления
template<class Archive>
inline void serialize(Archive & ar, CString & s, const unsigned int file_version) {
split_free(ar, s, file_version);
}
Я не знаю, почему макрос не работает. Однако я все еще сталкиваюсь с проблемами с CArray. Я попробовал простое решение
ar & make_nvp("CArray",myCArray);
но это не создает никакого XML. И затем я попытался перебрать такой массив
for(int i=0; i < myCArray.GetCount(); i++) {
MyClass* m = (MyClass*) myCArray.GetAt(i);
ar & BOOST_SERIALIZATION_NVP(m);
}
но это не вызывает сериализацию класса. Есть ли прямой способ сериализации массивов, таких как std::vector или std::list в примерах Boost?