0

0

C++如何实现可配置的序列化格式切换?(JSON/二进制/YAML互转)

尼克

尼克

发布时间:2026-02-25 14:08:02

|

423人浏览过

|

来源于php中文网

原创

应采用“数据结构与序列化协议解耦”设计:定义统一 serialize(serializer& s) 接口,由 jsonserializer、binaryserializer、yamlserializer 等子类实现具体格式逻辑,字段映射、配置策略集中管控,避免硬编码多套序列化函数。

c++如何实现可配置的序列化格式切换?(json/二进制/yaml互转)

怎么让同一个C++类支持JSON、二进制、YAML三种序列化格式?

靠硬编码三套序列化逻辑,维护成本高、易出错。真正可行的路是把「数据结构」和「序列化协议」解耦——用统一的数据中间表示(比如 std::map<:string std::any></:string> 或自定义 VariantMap),再按需绑定不同后端。

常见错误是直接在类里写 to_json()to_binary()to_yaml() 三个函数,结果字段增删时总漏改一个,测试也难覆盖全路径。

  • 推荐做法:定义一个 serialize(Serializer& s) 成员函数,只描述字段名与值的映射关系;所有格式由外部 Serializer 子类实现(如 JsonSerializerBinarySerializerYamlSerializer
  • 字段顺序、默认值、忽略策略等配置,统一收口到 Serializer 构造参数或配置对象里,不散落在各处
  • 注意 std::any 在 C++17+ 可用,但跨平台项目若需兼容旧编译器,建议用 boost::variant 或轻量级 variant 实现

JSON 和 YAML 序列化能共用同一套解析逻辑吗?

能,但仅限于“读取”阶段——只要底层都转成键值对结构(比如 std::map<:string variant></:string>),上层业务代码就完全不用感知格式差异。但写入时不能混用:YAML 支持锚点、折叠块、时间戳等 JSON 没有的特性,强行用 JSON 库写 YAML 会丢信息或报错。

典型坑是用 nlohmann::json 加载 YAML 文件(它不支持),或用 yaml-cpp 解析 JSON 字符串(它要求严格 YAML 语法)。

立即学习C++免费学习笔记(深入)”;

Cogniflow
Cogniflow

Cogniflow是一个无代码AISaas解决方案,允许用户创建和部署AI模型,

下载
  • 读取时:用 yaml-cpp 加载 YAML 或 JSON 都行(它兼容 JSON 子集),但需调用 YAML::LoadFile() 而非 YAML::Load() ——后者对换行/缩进更敏感
  • 写入时:JSON 必须用 nlohmann::jsonrapidjson;YAML 必须用 yaml-cpp;二者输出接口不兼容,别试图桥接
  • 如果项目只读不写 YAML,可全程用 yaml-cpp 统一处理,省去格式判断逻辑

二进制序列化怎么保证跨平台兼容性?

核心问题是字节序、对齐、浮点表示、字符串编码。用 memcpy 直拷结构体,在 x86 和 ARM 上可能因对齐规则不同而读错;float/double 在部分嵌入式平台不是 IEEE 754,直接序列化会失真。

常见错误是把 sizeof(MyStruct) 当作序列化长度,没考虑 padding 字节;或用 reinterpret_cast<char>(&obj)</char> 写内存,结果在不同编译器下字段偏移不一致。

  • 必须手动控制字段顺序和对齐:用 #pragma pack(1)alignas(1) 消除 padding,且所有字段声明顺序固定
  • 整数一律转为网络字节序:htons()/htonl() 处理 uint16_t/uint32_t,避免大小端问题
  • 浮点数不直接序列化,转成 uint32_t / uint64_t 再存(用 std::bit_cast 或 union),确保位模式一致
  • 字符串用变长前缀(uint32_t len + char data[len]),别依赖 null-terminator

如何动态切换序列化格式而不改业务代码?

关键在抽象出 Serializer 接口,并用工厂或配置驱动实例创建。比如从配置文件读到 format: "binary",就 new 一个 BinarySerializer;换成 "json" 就换实例——业务层只调用 s.serialize(obj),完全无感。

容易被忽略的是:不同格式的错误处理语义不同。JSON 解析失败抛 json::parse_error,二进制校验失败可能返回 std::errc::invalid_argument,YAML 加载失败又可能是 YAML::ParserException。统一异常体系必须提前设计好。

  • 工厂函数返回 std::unique_ptr<serializer></serializer>,构造时传入配置对象(如 SerializerConfig{.endian = LITTLE, .use_crc = true}
  • 所有 Serializer 子类必须实现 name() 方法(返回 "json""binary" 等),方便日志和调试
  • 不要在构造 Serializer 时打开文件或连接网络——延迟到 serialize()deserialize() 调用时才做 I/O,否则初始化失败会导致整个模块不可用

最麻烦的其实是类型系统边界:比如 YAML 允许 null!!timestamp!!set,JSON 只有 null,二进制通常只认基本类型。这些语义鸿沟没法自动填平,得在配置里显式声明字段是否可空、是否带单位、是否有序列化约束——漏掉一条,上线后就可能 crash。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

智谱清言 - 免费全能的AI助手
智谱清言 - 免费全能的AI助手

智谱清言 - 免费全能的AI助手

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

448

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

323

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

592

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

246

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

886

2024.03.01

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

55

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 9.6万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号