CAPCOM开源REDox:高性能.NET结构化数据引擎解析,一个Token DOM统一JSON/CBOR/MessagePack等9种格式
【免费下载链接】REDoxHigh-performance, token-based structured data engine for .NET. A core component of REX, the technology behind CAPCOM's next-generation game engine.项目地址: https://gitcode.com/gh_mirrors/redox/REDox
REDox是 CAPCOM 为其次世代游戏引擎 "REX" 技术打造的高性能 .NET 结构化数据引擎,采用独特的Token DOM(令牌 DOM)设计,用同一套紧凑的 64 位令牌结构统一处理JSON、JSON5、CBOR、MessagePack、TOML、XML、HTML、CSV、INI共 9 种格式。它同时做到:解析速度媲美System.Text.Json的 tape DOM、可编辑能力达到JsonNode级别、灵活性比肩 Newtonsoft.Json——这正是官方基准测试中反序列化最高1.8 倍、自动并行反序列化最高2.8 倍于 System.Text.Json 的来源。🚀
一、REDox 是什么?为什么值得关注
REDox 不是"又一个 JSON 序列化库"。它把结构化数据解析为固定大小的令牌序列,这个令牌序列既是文档模型,也是所有格式共享的"结构索引层":
JSON / JSON5 / CBOR / MessagePack / TOML / XML / HTML / CSV / INI / DOX ↓ 紧凑的 Token DOM / IR(中间表示) ↓ Reader / Writer / Serializer / Deserializer ↓ .NET 对象、JSON、CBOR、MessagePack、TOML、XML、HTML、DOX……三个通常互相冲突的目标被它同时拿下:
- ⚡速度:tape DOM 级别的解析性能
- ✏️可编辑:直接在文档上增删改,无需构建重型对象树
- 🔄灵活:位置无关的
$type、$id/$ref、乱序构造函数绑定(Newtonsoft.Json 的经典能力)
官方声明它是 "REX" 技术(CAPCOM 次世代游戏引擎的核心)的组成部分之一,且以Apache-2.0协议开源,要求.NET 10+。
二、核心架构:一个 64 位令牌如何统管一切
REDox 的"心脏"是位于 DToken.cs 的64 位双模式令牌。每个值都由一个固定大小的 64 位整数描述,其中 1 个扩展位决定载荷的解释方式:
- 扩展位 = 0:载荷交由文档/格式层解释——令牌是"源数据视图",字符串、数字可以直接复用原始缓冲区切片,不急于物化
- 扩展位 = 1:载荷解释固定由 REDox 掌控,配合控制令牌实现格式无关的编辑操作(插入 / 删除 / 替换)
令牌能表示 null、布尔、整数、浮点、字符串、二进制、时间戳、大数、数组、对象、注释/空白(trivia)等,类型枚举定义在 DTokenKind.cs。
💡 通俗理解:传统 Node DOM 每个节点都是堆上对象,内存分散、GC 压力大;REDox 把整个文档压成一条紧凑的"磁带",CPU 缓存友好,这就是它分配更少的根本原因。
可变的 Tape DOM:编辑而不重建
传统 tape DOM 是只读的(结构靠扁平序列隐式表达)。REDox 在容器视图(DArray、DObject、DMap,见 DArray.cs、DObject.cs、DMap.cs)上增加了一层间接层:值槽位可重新链接,空闲列表复用空出的令牌槽位——插入、删除、替换都不需要重建整个文档,却保留了顺序布局的缓存友好性。
不对称读写设计
读和写的需求完全不同,REDox 为两个方向设计了不同路径:
| 方向 | 策略 | 为什么 |
|---|---|---|
| 序列化 | 通过DataWriter单趟直写输出缓冲 | 值已知,无需前瞻,无需中间 DOM |
| 反序列化 | 先构建 Token DOM,再通过DataReader按令牌 id 随机访问 | 结构未知,需要前瞻、乱序绑定、上下文查询 |
正因为反序列化时整个结构"一次性可见",REDox 才能做到:
- 数组/集合预分配正确大小
$type出现在对象的任何位置都能被解析- 构造参数乱序收集、一次性绑定(支持 record 与主构造函数)
- 用整篇文档上下文解析
$id/$ref引用环 - 自动选择顺序或并行反序列化
- 字符串、数字按需解码,不变的源切片直接复用
相关抽象见 Serialization 目录(DataReader/DataWriter/DataConverter<T>)。
三、性能表现:基准测试数据一览
官方基准(BenchmarkDotNet,.NET 10,AMD Ryzen Threadripper PRO 5975WX)显示,相对 System.Text.Json:
| 数据集 | 反序列化 | 并行反序列化 | 序列化 |
|---|---|---|---|
canada.json(数值密集,约 2.2 MB) | 1.68x | 2.84x | 1.06x |
citm_catalog.json | 1.77x | 2.25x | 1.62x |
twitter.json | 1.36x | 2.34x | 1.42x |
内存分配同样可观:canada.json反序列化 REDox 约分配2.56 MB,而 System.Text.Json 约8.53 MB(约为 1/3)。
📌 注意:这些比值仅针对基准数据集,不是通用性能保证——官方也建议"用自己的负载做基准测试"。测试数据(simdjson-data、JSONTestSuite等)以子模块形式位于 external/ 目录。
四、9 种格式统一接入,跨格式转换一行搞定
各格式以独立 NuGet 包提供(包名CAPCOM.REDox.*前缀,命名空间REDox.*):
| 包名 | 状态 | 说明 |
|---|---|---|
CAPCOM.REDox | 公开 | 核心 + JSON + JSON5 + DOX + 通用序列化基础设施 |
CAPCOM.REDox.Cbor/.MessagePack/.Ini/.Dynamic | 公开 | CBOR、MessagePack、INI 集成 / dynamic 访问 |
CAPCOM.REDox.Serialization.SystemTextJson/.NewtonsoftJson | 预览 | 两大主流 JSON 库的兼容层 |
CAPCOM.REDox.Serialization.DataContractJson | 公开 | DataContractJsonSerializer 兼容层 |
CAPCOM.REDox.Toml/.Xml/.Html/.Csv | 预览 | TOML、XML、HTML、CSV 支持 |
因为共享同一 Token IR,跨格式转换变得极其简单——官方示例(见 README.md 的"Cross-format conversion"一节):
JSON5 → Token IR → JSON JSON → Token IR → CBOR CBOR → Token IR → MessagePack TOML → Token IR → JSON解析入口如 JsonDocument.cs、CborDocument.cs、MessagePackDocument.cs 都提供Parse/Encode等成对 API,解析成文档模型后即可用另一种格式重新编码。
五、进阶特性速览
1. 自动并行反序列化 🔢
反序列化器会检查每个数组的元素数与令牌范围:足够大就并行,太小就顺序执行,避免调度开销。阈值可配置,默认值见 ParallelDeserializeOptions.cs:
var settings = new DoxSerializerSettings { ParallelOptions = new ParallelDeserializeOptions { ParallelDeserializeEnabled = true, MinimumNumberOfElements = 1024, MinimumNumberOfTokens = 4096 } }; var players = JsonSerializer.Deserialize<Player[]>(json, settings);2. JSON5 注释与 Trivia 保留 ✏️
解析 JSON5 时开启PreserveTrivia,注释、空白等"琐碎信息"能在编辑文档后依然保留并重新编码——对配置文件的原地改写场景非常实用。入口见 Json5Document.cs。
3. NDJSON / JSON 序列异步流式读取 🌊
JsonSequence可以异步流式读取 NDJSON 或超大顶层数组,逐值产出、不全量加载内存,适合日志、事件流场景(见 JsonSequence.cs 与 JsonStreamTest.cs)。
4. dynamic 访问 🧩
REDox.Dynamic包提供DDynamic,用 C# 的dynamic语法直接读写令牌 DOM(如player.name),还能动态构建对象再序列化,见 DDynamic.cs。
5. DOX 格式与深克隆 📦
DOX 是镜像内存令牌布局的二进制格式,从 DOX 重建文档几乎不需要结构重建,因此天然适合做基于序列化的深克隆——得到的是独立可编辑副本而非共享只读视图,见 DoxSerializer.cs。
6. 三大主流序列化器兼容层 🔁
存量项目可以直接把现有的JsonSerializerOptions/JsonSerializerSettings/DataContractJsonSerializerSettings适配进 REDox(兼容层分别位于 REDox.Serialization.SystemTextJson、REDox.Serialization.NewtonsoftJson、REDox.Serialization.DataContractJson),迁移成本大幅降低。
六、快速上手:安装与 30 秒体验
dotnet add package CAPCOM.REDox dotnet add package CAPCOM.REDox.Cbor dotnet add package CAPCOM.REDox.MessagePack预览包需加--prerelease(如dotnet add package CAPCOM.REDox.Toml --prerelease)。
核心用法一以贯之——同一个 API 表面完成序列化、反序列化、解析、编辑:
using REDox.Json; var json = JsonSerializer.Serialize(player); // 序列化 var restored = JsonSerializer.Deserialize<Player>(json); // 反序列化 using var doc = JsonDocument.Parse(json); // 解析为 Token DOM var root = doc.RootElement.AsObject(); root["Name"] = "Claire"; // 替换 root.Add("Hp", 100); // 新增 root.Remove("Level"); // 删除 var edited = doc.RootElement.ToJsonString(); // 重新编码想从源码构建与跑测试:
git clone --recurse-submodules https://gitcode.com/gh_mirrors/redox/REDox cd REDox dotnet build REDox.slnx -c Release dotnet test REDox.slnx -c Release dotnet run -c Release --project benchmarks/REDox.Json.Benchmarks七、仓库结构导览 🗂️
| 路径 | 内容 |
|---|---|
| src/REDox/ | 核心引擎:令牌(DToken.cs)、文档(Document.cs)、容器视图、Serialization(转换器、元数据属性) |
| src/REDox/Json/ | JSON / JSON5 解析、写入、序列器 |
| src/REDox.Cbor/、src/REDox.MessagePack/ | CBOR、MessagePack 集成 |
| src/REDox.Toml/、src/REDox.Xml/、src/REDox.Html/、src/REDox.Ini/、src/REDox.Csv/ | 各预览/公开格式组件 |
| tests/ | 全量测试,含各格式兼容性测试 |
| benchmarks/ | BenchmarkDotNet 基准(JSON、CBOR、MessagePack、Dynamic) |
| external/ | 第三方测试数据(JSONTestSuite、toml-test 等,git 子模块) |
八、总结:谁应该关注 REDox?
✅该用它的场景:
- 追求极致性能与低 GC 压力的 .NET 数据管道(游戏、服务端高频 IO)
- 需要跨格式互转(如 CBOR ⇄ JSON ⇄ MessagePack)的系统
- 想原地编辑 JSON/JSON5 并保留注释的配置工具
- 存量 Newtonsoft.Json / System.Text.Json 项目想平滑提速
⚠️需要权衡的:项目处于活跃开发期,预览组件 API 可能变化;要求 .NET 10+。
REDox 用"一个 64 位令牌"把解析、编辑、格式互转、并行反序列化统一到同一数据模型上,是 .NET 生态中目前少有的"格式无关结构化数据引擎"。对数据格式打交道多的开发者,值得把它加进技术雷达 📡。
【免费下载链接】REDoxHigh-performance, token-based structured data engine for .NET. A core component of REX, the technology behind CAPCOM's next-generation game engine.项目地址: https://gitcode.com/gh_mirrors/redox/REDox
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考