请教 boost: serialization问题
学习一个小时,能将简单的类进行序列化。
我的问题是:
1: 项目中有很多.cpp 和.h文件, 怎么将里面的类、member 都序列化?
2: 这些文件需要先zlib处理下, 但是从void serialize( class &, ....)里要看不到任何 zlib的,我该怎么设计,用哪种设
计模式?
3. 大牛要是有相关代码能参考下就好了,3q.
[解决办法]
方法1:用1楼的方法,写一个宏简化声明的步骤
方法2:写一个parser,分析源文件,然后自动生成对应代码
方法3:和1楼类似,用boost::fusion
先用fusion把各种struct变成fusion::sequence(类似tuple),然后利用fusion::for_each模板简化代码。
代码量和方法1查不多,还是比较可控的。
方法3代码:eigen是个数学库,网上下一个,只用头文件不用编译
#pragma once#include <Eigen/Dense>#include <string>#include <boost/serialization/serialization.hpp>#include <boost/archive/text_oarchive.hpp>#include <boost/archive/text_iarchive.hpp>class Player {public: Player(const std::string& name): mName(name),mPos(0,0){} Player():mPos(0,0){} void move(float x, float y) { mPos += Eigen::Vector2f(x,y); std::cout << mName << " move: " << "(" << x <<", " << y << ")" << std::endl; } std::string mName; Eigen::Vector2f mPos;};//------------------------------------------// serialization functionstemplate<typename archive>struct serializer { serializer(archive& ar):ar(ar) {} template<typename T> void operator()(T& o) const { ar & o; // assuming binary for example... } archive& ar;};template<typename archive, typename sequence>void my_serialize(archive& ar, sequence& v) { boost::fusion::for_each(v, serializer<archive>(ar));}//------------------------------------------// serialization declarationsBOOST_FUSION_ADAPT_STRUCT( Eigen::Vector2f, (float&, x()) (float&, y()))BOOST_FUSION_ADAPT_STRUCT( Player, (std::string, mName) (Eigen::Vector2f, mPos))#define MY_SERIALIZE(Type) \ template<class Archive> \ inline void serialize(Archive& ar , Type& v, const unsigned int version) { \ my_serialize(ar, v); } namespace boost { namespace serialization { MY_SERIALIZE(Eigen::Vector2f); MY_SERIALIZE(Player); } // namespace serialization} // namespace boost