如何使用Boost不逐个指定字段将结构体写入TXT文本文件
实现方案
C++本身没有运行时反射能力,你想要类似二进制dump的简洁文本写入方式,需要借助Boost.Serialization自带的文本归档能力,只需要给目标结构体做一次序列化适配,后续写入时就可以一行代码完成,不需要每次操作都指定字段。
第一步:给结构体添加序列化适配
只需要在结构体定义内加一行序列化模板函数,Boost会自动遍历所有字段完成类型适配,这部分代码只需要写一次,后续所有序列化场景都可以复用:
#include <boost/serialization/access.hpp> #include <boost/serialization/string.hpp> // 序列化std::string必须引入该头文件 struct Frame { uint32_t address{ 0 }; uint16_t marks{ 0 }; uint16_t age{ 0 }; char gender{ 'M' }; std::string userName; private: friend class boost::serialization::access; template<class Archive> void serialize(Archive & ar, const unsigned int version) { ar & address; ar & marks; ar & age; ar & gender; ar & userName; } };
注:如果不想侵入原有结构体定义,也可以把序列化函数写到结构体外部的Boost序列化适配层,不需要修改原结构体代码。
第二步:文本写入实现
直接用Boost提供的text_oarchive替换二进制归档即可,写法和你原有二进制写入逻辑几乎一致:
#include <boost/archive/text_oarchive.hpp> #include <fstream> // ofs为已打开的std::ofstream文件流对象,f为Frame结构体实例 boost::archive::text_oarchive ar(ofs, boost::archive::no_header); ar << f; // 直接写入结构体即可,不需要手动指定任何字段
补充说明
- 生成的文本是结构化可打印格式,读取时用
text_iarchive可以直接反序列化回结构体实例,不需要手动解析字段。 - 如果要完全不写任何字段相关的适配代码,纯C无法实现,因为C没有原生运行时反射能力,所有类型信息都在编译期确定,必须在编译期完成字段的遍历注册。
内容的提问来源于stack exchange,提问作者Rav
相关产品推荐
相关产品推荐

