REDox深度解析:DOX二进制格式如何秒级实现对象深拷贝
【免费下载链接】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 的DOX 二进制格式是 .NET 高性能结构化数据引擎 RE:Dox(RE:Dox)的核心能力:通过"序列化往返"实现对象深拷贝,且速度快到远超直觉。它由卡普空(CAPCOM)下一代游戏引擎 REX 技术驱动开发,采用 Apache-2.0 协议开源。标题里说"秒级"其实保守了——基准测试中整套流程通常在微秒级完成。
为什么"深拷贝"是个老大难问题
在 C# 里复制一个带嵌套引用类型的对象,传统方式都很别扭:
- 手写递归
Clone()方法:维护成本高,漏一个字段就是 Bug; - 用反射拷贝:性能差,且 AOT 场景下反射受限;
- 用 JSON 序列化再反序列化:能用,但文本解析和转义开销明显。
RE:Dox 给出的思路是:造一种与内存结构"长得一样"的二进制格式。序列化它、反序列化它,天然就是一次完整的深拷贝。核心代码只有两行:
byte[] dox = DoxSerializer.Serialize(player); var clone = DoxSerializer.Deserialize<Player>(dox);实现位于 src/REDox/DoxSerializer.cs,还提供了DeepCopy<T>一步到位,以及DeepEquals<T>用于判断两个对象是否深度相等。
DOX 二进制格式长什么样
DOX 文件由 5 段组成,理解它是理解性能的关键:
| 区段 | 内容 | 作用 |
|---|---|---|
| 文件头 | 魔数 "DOX" + 版本号 | 快速校验合法性 |
| 值数据区 | 字符串、日期、字节串等原始数据 | 存放需要落盘的值 |
| 对齐填充 | 补零到 8 字节对齐 | 让 token 表按 8 字节整齐排布 |
| Token 表 | 一串固定 64 位的DToken | 文档结构的"索引",每个值一个槽位 |
| 文件尾 | token 数量 + token 表偏移 | 解析时从尾部定位 token 表 |
真正的设计精髓在 Token 表:每个值只占一个8 字节定长的 64 位整数,高位描述类型(布尔、整数、字符串、数组、Map…),低位要么直接内联小值,要么记录指向值数据区的偏移和长度。整个文档的结构就是一张扁平的 token 表——这正是 RE:Dox 在内存中的原始表示(详见 src/REDox/DToken.cs 与 src/REDox/DTokenKind.cs)。
快在哪:零结构重建 + 缓冲复用
① 解析时几乎"什么都不做"
看 src/REDox/DoxDocument.cs 的TryRead:它只校验魔数和版本,然后从文件尾读出 token 表位置,用MemoryMarshal.Cast把这段字节直接重解释为DToken数组,跳过空槽位找到根节点就返回。没有逐字节解码,没有构建对象树——因为磁盘格式和内存格式本来就是同一种东西。
② 读写器实例复用,分配极少
Serialize和Deserialize内部都通过实例缓存复用DoxWriter/DoxDocument(见 src/REDox/DoxSerializer.cs),字节缓冲区同样走ArrayPool租借归还。RE:Dox 官方基准(.NET 10 + BenchmarkDotNet)显示,JSON 路径上反序列化最高约 1.8 倍于 System.Text.Json,且canada.json分配量仅约 2.56 MB,对比约 8.53 MB——低分配特性在 DOX 路径上体现得更彻底。
③ 拷贝出来的副本"可写"
与某些序列化器产出只读视图不同,DOX 反序列化得到的是独立、可编辑的副本(token DOM 支持插入/删除/替换)。这一点在 README 的"DOX format and deep clone"章节有明确说明。
顺手神器:DeepEquals 深度相等判断
tests/REDox.Tests/DoxSerializeTest.cs 展示了典型用法——对字符串(含中文)、double/decimal/decimal、长整型等逐一DeepCopy验证。而比较两个对象是否相等,只需:
bool same = DoxSerializer.DeepEquals(a, b);它把两边分别序列化成 DOX 字节流后逐字节比对,简单可靠,实现见 src/REDox/DoxSerializer.cs。
如何开始使用 DOX 深拷贝
DOX 能力打包在核心 NuGet 包中,安装即用:
dotnet add package CAPCOM.REDox- 日常深拷贝 / 快照 / 回滚存档:
DoxSerializer.DeepCopy<T> - 需要落盘或跨进程传输:
Serialize到Stream/ 字节数组 - 需要深度比较:
DeepEquals<T>
相关配置项在 src/REDox/DoxWriteOptions.cs(如PreserveTrivia保留注释等辅助信息)。整体项目结构可以从 README.md 的架构图快速上手。
小结
| 传统深拷贝 | DOX 方案 |
|---|---|
| 递归 Clone / 反射 / 文本序列化 | 两行代码的序列化往返 |
| 维护成本高、易漏字段 | 编译器生成的标准转换路径,全字段覆盖 |
| 文本解析开销大 | 定长 token 表,解析即重解释 |
DOX 格式的本质,是把"序列化"从文本世界的重活变成了内存布局之间的搬运。对于需要频繁做对象快照、存档、撤销恢复的 .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),仅供参考