1

私は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のような配列をシリアル化する簡単な方法はありますか?

4

2 に答える 2

4

BOOST_SERIALIZATION_SPLIT_FREE(T)を使用する必要があります。ここで、Tはタイプ名(CStringやCArrayなど)であり、シリアル化を非侵入的にロードと保存に分割するコードを生成します。これは、クラス内(つまり、侵入型)のBOOST_SERIALIZATION_SPLIT_MEMBERと同等です。

于 2011-01-26T02:03:30.940 に答える
2

使用できるのはのみで、クラスを使用saveしてloadいる場合は、の定義にBOOST_SERIALIZATION_SPLIT_MEMBER()を追加できます。文字列に対してはそれを行うことができないため、serializeメソッドの観点からBoostシリアル化を実装する必要があります。

template<class Archive>
void serialize(Archive & ar, CString & s, const unsigned int version)
{
    std::string ss(s);
    ar & ss;
    s = ss.c_str;
}

これは効率が悪くなりますが、少なくともコンパイルする必要があります。

編集:実際には、無料の関数を分割できますが、保存および読み込み関数と一緒にこれを追加する必要があります:

#include <boost/serialization/split_free.hpp>

template<class Archive>
inline void serialize(Archive & ar, CString & s, const unsigned int file_version) {
    split_free(ar, s, file_version); 
}
于 2011-01-26T01:56:44.747 に答える