使用Boost C++序列化时,如何去除no_header模式下仍存在的'00'前缀?
解决Boost序列化text_oarchive多余版本号的问题
那个你看到的00其实是Boost序列化自动写入的版本号,它和归档头部是独立的——哪怕你指定了no_header,只要你的serialize函数包含了版本参数,Boost就会默认把版本号(默认值为0)序列化到输出里。下面给你两种实用的解决办法:
方法1:移除序列化函数的版本参数(最简单)
如果你的类不需要版本控制,直接去掉serialize函数里的const unsigned int version参数即可,这样Boost就不会自动处理版本号,也就不会输出那个00了:
#include <boost/archive/text_oarchive.hpp> #include <fstream> class Frame{ public: int x; int y; int z; }; // 移除版本参数,使用无版本的序列化逻辑 template <typename Archive> void serialize(Archive& ar, Frame& f) { ar& f.x; ar& f.y; ar& f.z; } int main () { Frame f={1,2,3}; std::ofstream ofs("TextFile.txt", std::ios::out); boost::archive::text_oarchive write(ofs, boost::archive::no_header); write << f; ofs.close(); return 0; }
运行这段代码后,输出文件里就会是你期望的1 2 3。
方法2:拆分序列化的保存/加载逻辑(保留版本控制)
如果你需要为类保留版本控制能力,可以用BOOST_SERIALIZATION_SPLIT_MEMBER宏把序列化拆分为save和load函数,在save里只序列化你的成员变量,不主动处理版本号:
#include <boost/archive/text_oarchive.hpp> #include <boost/serialization/split_member.hpp> #include <fstream> class Frame{ public: int x; int y; int z; private: friend class boost::serialization::access; // 保存逻辑:只序列化成员变量 template <typename Archive> void save(Archive& ar, const unsigned int version) const { ar& x; ar& y; ar& z; } // 加载逻辑:可以根据版本号处理兼容性 template <typename Archive> void load(Archive& ar, const unsigned int version) { ar& x; ar& y; ar& z; // 如果未来类结构变化,可以在这里添加版本分支处理 } BOOST_SERIALIZATION_SPLIT_MEMBER() }; int main () { Frame f={1,2,3}; std::ofstream ofs("TextFile.txt", std::ios::out); boost::archive::text_oarchive write(ofs, boost::archive::no_header); write << f; ofs.close(); return 0; }
这种方式既保留了版本控制的灵活性,又能避免输出多余的版本号。
内容的提问来源于stack exchange,提问作者Rav
相关产品推荐
相关产品推荐

