xrain
|
a7ed2902f5
|
docs: 补充 soulsoft 参考实现分析与路线对比
- §1.5 读源码总结 soulsoft_serialization 的做法:宏给每个类生成 4 个序列化方法
+ superType 参数,继承靠编译期 super/静态方法调用链,零反射读字段
- §2 方案总览明确路线 A(入口不变+父类宏)为主方案
- §8 新增路线 A/B 取舍对比表,明确推荐路线 A 的理由:
保留 Serialize(obj)/Deserialize<T>(json) 免标注 API,只借 soulsoft
「宏生成静态类型字段代码」技巧
|
2026-08-17 12:48:03 +08:00 |
|
xrain
|
85b17ed8ab
|
docs: 父类字段序列化方案(宏 @JsonExportFields + 静态导出方法)
调研结论:Cangjie 反射对字段/prop/方法的声明类严格校验(declaringClass != instance 类型)
堵死运行时方案;宏无法编译期查询父类字段;编译器禁止子类遮蔽父类字段。
唯一可行通路(已实测):宏标注父类生成 exportJsonFields/importJsonFields 静态方法,
序列化库遍历 superClass 链通过静态方法反射调用(静态方法无实例声明类检查,
子类实例可直接作父类类型参数)。
|
2026-08-17 12:27:38 +08:00 |
|
xrain
|
e83bcaf68c
|
test: 新增 JsonSerializer 单元测试(cjpm test,13 用例);fix: 顶层 Deserialize<?T>(null) 返回类型化 None
- 覆盖:基础类型、对象字段输出(下划线保留/注解/忽略/None→null/继承限制)、
Array/ArrayList/HashSet/HashMap 往返、枚举、命名策略、Option 字段、
宽松类型转换、maxDepth
- 修复 JsonReader:Option 反序列化 null 时用反射构造目标类型 None 构造器
(反射层 Option 构造器统一按 1 参数槽登记),而非返回裸 None 导致
read<T> 类型不匹配异常
|
2026-08-17 12:11:35 +08:00 |
|
xrain
|
67da604294
|
refactor: 移除 ignoreNull 选项——非 @JsonIgnore 字段一律输出,None 输出 null
- JsonOption 删除 ignoreNull
- JsonWriter.writeObject 不再按 null 跳过字段(只跳过 @JsonIgnore)
- 删除不再使用的 isNoneValue
- 测试:remark(None)→null 且保留;temp(@JsonIgnore) 唯一被排除
|
2026-08-17 11:21:56 +08:00 |
|
xrain
|
ff1bd51f52
|
fix: isNoneValue 误判非 Option 值为 None(ignoreNull 时所有字段被跳过)
- 原实现 unwrapOptionValue(v).isNone() 把「非 Option」也返回 None → isNone()=true
- 改为直接检查 EnumTypeInfo.destruct 构造器名是否 None,非枚举返回 false
- 新增 None 字段测试(remark → null;ignoreNull=true 时省略 remark 保留其他)
|
2026-08-17 11:20:12 +08:00 |
|
xrain
|
de875234e4
|
fix: 命名策略不剥除前导下划线(_name 原样输出 _name)
- applyNamingPolicy 不再去掉字段名前导 _,策略只影响字母大小写
- @JsonPropertyName 仍可覆盖(_alias → user_alias)
- 测试改为 _ 前缀字段并验证原样输出
|
2026-08-17 11:12:22 +08:00 |
|
xrain
|
172681f92c
|
refactor: 取消 annotations 子目录,特性文件改名 JsonAnnotations 并入 json 包
- src/json/annotations/JsonAttributes.cj → src/json/JsonAnnotations.cj
- 包 simapi_serialization.json.annotations → simapi_serialization.json
- @JsonPropertyName / @JsonIgnore 现在与 JsonSerializer 同包,import simapi_serialization.json.* 即可
|
2026-08-17 11:04:25 +08:00 |
|
xrain
|
0bc7e213f9
|
refactor: 全部实现移入 json 子包,attributes 改名 annotations
- src/Json*.cj → src/json/(包 simapi_serialization.json,对应 .NET System.Text.Json)
- src/attributes → src/json/annotations/(包 simapi_serialization.json.annotations)
- 根包 simapi_serialization 保留为 cjpm 扫描锚点,public import 重导出 json + annotations
- 用法:import simapi_serialization.*(重导出)或 import simapi_serialization.json.* / .json.annotations.*
|
2026-08-17 11:03:01 +08:00 |
|
xrain
|
9a656e60d8
|
refactor: @JsonPropertyName/@JsonIgnore target 收窄为仅 MemberVariable
序列化/反序列化只处理 var 成员变量(instanceVariables),不处理 prop 属性;
注解标到 prop 上现在直接编译报错,避免标了不生效的静默陷阱
|
2026-08-17 11:00:35 +08:00 |
|
xrain
|
8d10c31473
|
feat: SimApiSerialization 全反射 JSON 序列化库 v1
对齐 .NET System.Text.Json:
- JsonSerializer.Serialize(obj, JsonOption) / Deserialize<T>(jsonString, JsonOption)
- @JsonPropertyName / @JsonIgnore 特性(运行时注解反射)
- JsonOption:PropertyNamingPolicy(None/CamelCase/SnakeCase)、ignoreNull、maxDepth
- 全反射实现:基础类型/枚举/Option/Array/ArrayList/HashSet/HashMap/嵌套对象
- 仓颉特性适配:
* Option 是泛型枚举 → EnumTypeInfo.destruct/construct 处理
* 集合 get(i) 返回 Option<T> → Some/None 解包迭代
* 集合泛型不变 → 反射方法调用(toArray/get/add/keys)而非 cast
* as 返回 Option → ?? 解包;JsonKind 用 is 判断
- 已知限制:反序列化需无参构造+var 字段;父类字段不序列化(平台严格类型校验);
枚举按名字;循环引用用深度上限保护
- 已实测:User 完整回环 + 数组/HashMap 回环 + 特性生效
|
2026-08-17 10:47:51 +08:00 |
|