2017-06-02 4 views
0

私はboost v1.63のXMLシリアル化を使用しています。ブーストシリアル化で使用されるクラスのバージョンが8ビットに制限されているのはなぜですか?

BOOST_CLASS_VERSION(MySerializedClass, APP_INT_VERSION) 

は、私は次のようにブーストのマクロを使用して(私のシリアル化されたクラスのバージョン番号としてAPP_INT_VERSIONを使用するために優れているとされています

#define APP_INT_VERSION 10101 \\ version 1.1.1

プリプロセッサマクロの例として、アプリケーションのバージョン番号を維持します

しかし、コンパイル時にエラーが発生する - 私をブースト/シリアライゼーション/ version.hpp =>ライン#78の読書で指し示す:

// version numbers limited to 8 bits !!! 

なぜこの8ビットの制限があるのだろうか?

+1

できるだけ小さいのが目的なのですか? – Stargateur

+3

クラスバージョンとしてアプリケーションバージョンを使用しないでください。それぞれのクラスごとに個別に必要なときにバンプしてください。 – Ryan

+0

@Stargateurはこれほど小さすぎるのではないですか?ソフトウェア/クラスは255回以上アップデートされる予定ですか? – rat6

答えて

0

versionパラメータの型はint型であるため、フルレンジを使用できます。 BOOST_CLASS_VERSIONマクロを省略して、hereと書かれているように直接テンプレートの特殊化によってバージョンを設定してください。バージョン<のアサーションは私の意見ではベストプラクティスとしてのみ役立ちます。

完全なサンプルコードは、次のとおりです。

#include <fstream> 
#include <boost/archive/xml_iarchive.hpp> 
#include <boost/archive/xml_oarchive.hpp> 

#define APP_INT_VERSION  10101  

class gps_position 
{ 
private: 
    friend class boost::serialization::access; 
    template<class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     using boost::serialization::make_nvp; 
     ar & make_nvp("deg", degrees); 
     ar & make_nvp("min", minutes); 
     ar & make_nvp("sec", seconds); 
    } 
    int degrees; 
    int minutes; 
    float seconds; 
public: 
    gps_position(){}; 
    gps_position(int d, int m, float s) : 
     degrees(d), minutes(m), seconds(s) 
    {} 
}; 

namespace boost {              
namespace serialization {            
template<>                
struct version<gps_position>              
{                  
    BOOST_STATIC_CONSTANT(int, value = APP_INT_VERSION);   
};                  
}                  
} 


int main() { 
    std::ofstream ofs("filename"); 
    const gps_position g(35, 59, 24.567f); 

    boost::archive::xml_oarchive oa(ofs); 
    oa << BOOST_SERIALIZATION_NVP(g); 

    return 0; 
} 

をとにかく、(すでに他の人がコメントしたように)ので、多くの場合、直列化バージョンを高めるために、良いアイデアではありません。

関連する問題