From 24c5b1e1ba96cbb845d7f91f9bf2fd1593a89524 Mon Sep 17 00:00:00 2001 From: xRain Date: Mon, 17 Aug 2026 13:16:49 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E8=A1=A5=E5=85=85=E5=A4=9A=E5=B1=82?= =?UTF-8?q?=E7=BB=A7=E6=89=BF=E6=94=AF=E6=8C=81=E8=AF=B4=E6=98=8E=EF=BC=88?= =?UTF-8?q?=E5=B7=B2=E5=AE=9E=E6=B5=8B=E4=B8=89=E5=B1=82=E7=BB=A7=E6=89=BF?= =?UTF-8?q?=20+=20=E4=B8=AD=E9=97=B4=E5=B1=82=E6=97=A0=E5=AE=8F=E8=B7=B3?= =?UTF-8?q?=E8=BF=87=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - §3.3 多层继承:库沿 superClass 链逐层调用每层 exportJsonFields, 每层各导各的,中间层无宏自动跳过继续向上 - 实测:三层标宏 → 爷父字段均导出;中间层无宏 → 跳过仍导出祖父字段 - 与 soulsoft super 调用链的区别:本方案靠库侧遍历,宏生成更简单 - 测试计划补充中间层无宏用例 --- docs/父类字段序列化方案.md | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/docs/父类字段序列化方案.md b/docs/父类字段序列化方案.md index 71d6501..315f3af 100644 --- a/docs/父类字段序列化方案.md +++ b/docs/父类字段序列化方案.md @@ -281,7 +281,30 @@ open class BaseUser { } ``` -### 3.3 宏包的编译方式 +### 3.3 多层继承(已实测验证) + +库沿 `superClass` 链**逐层**调用每层的 `exportJsonFields`(见 §4),因此任意层数的继承都支持: + +``` +GrandParent(标宏)→ Parent(标宏)→ Child(不标宏) + │ │ │ + └─ exportJsonFields └─ exportJsonFields └─ 主反射流程 + 导出 _gp 导出 _p 导出 _c +``` + +**实测结果(cjc 1.1.3,inherit_3level 探针)**: + +| 场景 | 结果 | +|---|---| +| 三层都标宏 | `_gp` + `_p` 均正确导出(`size=2`),子类自身 `_c` 由主反射流程处理 | +| 中间层不标宏 | 跳过该层继续向上,`_gp` 仍导出(`size=1`),`_p` 不导出 | + +规则: +- **每层各导各的**:宏只解析「本类声明」里的字段,父类字段由上层自己的宏负责——不需要在子类方法里递归调用父类方法(这点与 soulsoft 的 `super.serializeObject()` 链不同,本方案靠库侧遍历,宏生成更简单); +- **中间层无宏自动跳过**:`getStaticFunction` 抛异常即视为无宏,静默继续向祖父层查找; +- **注意**:若中间层(如 Parent)没标宏,它的字段 `_p` 不会被导出——要导出哪层的字段,哪层就标宏,语义清晰。 + +### 3.4 宏包的编译方式 Cangjie 宏需要两步编译(`cjc --compile-macro` 先编宏,再编使用宏的代码)。cjpm 对宏的支持: @@ -290,7 +313,7 @@ Cangjie 宏需要两步编译(`cjc --compile-macro` 先编宏,再编使用 > ⚠️ 待验证项:cjpm 对同包宏的编译顺序支持(见 §7 风险)。 -### 3.4 宏需要处理的细节 +### 3.5 宏需要处理的细节 | 细节 | 处理 | |---|---| @@ -454,6 +477,7 @@ main() { | 父类字段序列化 | 输出包含 `_id`/`_createdAt`,且 `@JsonIgnore` 父类字段不输出 | | 父类字段反序列化 | `Deserialize` 后父类字段值正确 | | 多层继承 | GrandParent → Parent → Child 三层字段全部输出 | +| 中间层无宏 | 三层链中 Parent 不标宏:`_gp` 仍导出,`_p` 不导出(逐层跳过) | | 无宏的类 | 行为与现状完全一致(回归) | | 子类字段与父类字段重名 | 子类优先(输出一份,值取子类的) | | 父类嵌套对象字段 | 父类字段值是对象时正确递归 |