私は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_1_45_0 \ boost \ serialization \ access.hpp(118):エラーC2039:'serialize':'ATL::CStringT'のメンバーではありません
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に再定義されるのを避けようとしています。これは、CStringsが非常に多く、プロジェクト全体をやり直すことを意味するためです。
また、CArrayをシリアル化したいのですが、同じタイプのエラーが発生します。シリアル化はCArrayのメンバーではありません。
編集: 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);
}
しかし、それはクラスのシリアル化を呼び出しているのではありません。Boostの例でstd::vectorやstd::listのような配列をシリアル化する簡単な方法はありますか?