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` 不导出(逐层跳过) | | 无宏的类 | 行为与现状完全一致(回归) | | 子类字段与父类字段重名 | 子类优先(输出一份,值取子类的) | | 父类嵌套对象字段 | 父类字段值是对象时正确递归 |