2012-02-22 19 views
2

は、シリアル化する構造を考えてみましょう:boost :: serialization :: traitsの具体的な例は?

struct MyStruct { 
    int a; 
    std::string b; 

template<class Archive> 
void serialize(Archive &ar, const unsigned int) 
    { 
    ar & a & b; 
    } 
}; 

私は明示的にtrack_neverobject_serializableの両方であることを、ブースト::シリアル化::特性を使用して、それをタグ付けします。私はtraits docsを見つめていましたが、それを適用する方法について私の心を捉えることはできないようであり、どこにでもサンプルを見つけることはできません。だから...

a)この特定のクラスに特性を適用するコードとは何ですか?

b)それぞれが適切であることを確認するBOOST_STATIC_ASSERT()とは何ですか?

c)この型を直接処理できる標準的なアーカイブクラスにメンバー関数やテンプレートがないため、このクラスのprimitive_typeを作成できないと思います。正しい?

プラットフォーム間またはバージョン間でのアーカイブの互換性については気にしませんが、MyStructの高速読み取り(書き込み)と侵入は問題ありませんが、可能であれば両方向で行ってください。

答えて

2

MyStructが特徴を適用する構造体テンプレート化やクラスではありませんので、すべてを行う必要があるBOOST_CLASS_IMPLEMENTATIONBOOST_CLASS_TRACKINGマクロ使用である:あなたは次の2行を記述する必要があると思いますあなたのクラス定義の外で

を:

BOOST_STATIC_ASSERT(boost::serialization::implementation_level<MyStruct>::value 
        == boost::serialization::object_serializable); 
BOOST_STATIC_ASSERT(boost::serialization::tracking_level<MyStruct>::value 
        == boost::serialization::track_never); 
:あなたは正しいことをやって検証する

BOOST_CLASS_IMPLEMENTATION(MyStruct, boost::serialization::object_serializable); 
BOOST_CLASS_TRACKING(MyStruct, boost::serialization::track_never); 

はA BOOST_STATIC_ASSERT()のように見えます

プリミティブ型ではないので、これをプリミティブ型にするのは意味がないと言います。

+1

このように、上記の2つのマクロは、入力した順番に正確に配置する必要があります。私はそれらを逆にしていたので、それが私のために働いていなかったのです。最後のセミコロンは必須ではありませんが、害はありません。 (これはすべてMinGW-32/gcc-4.4です。) – JimB

関連する問題