Commit Graph
27 Commits
Author SHA1 Message Date
xrain 4e4e6e866c 包名迁移: simapi_serialization → simcu::serialization(org=simcu) 2026-08-18 04:26:31 +08:00
xrain 455df5115b docs: 更新 README——任意字段名、TypeInfo 版 Deserialize、18 用例、tests 子包 2026-08-18 02:08:00 +08:00
xrain 7017b6b027 refactor: @SerializerParent 宏放宽——支持任意字段名(不要求 _ 前缀)
- isSerializableField 去掉 _ 前缀校验,任意 var/let 字段(有类型注解)均可导出/导入
- 配合 simapi-cj DTO 去下划线(code/message/data 等无 _ 前缀字段)
2026-08-18 01:15:24 +08:00
xrain f0dcdc5c2e refactor: 删除仅有空构造器的 public init() {}——编译器自动提供无参构造
- ReflectionCache.FieldMetadata / JsonOption 删除空 init
- 测试模型 LeafChild / LeafAll 删除空 init(反射构造正常)
- 保留有带参构造器的空 init(FieldInfo 等)
2026-08-18 00:59:58 +08:00
xrain c6269df957 feat: 新增 TypeInfo 版反序列化入口——按运行时类型反序列化
- JsonSerializer.Deserialize(typeInfo, jsonString[, options]): Any
- JsonReader.read(typeInfo, value, options): Any
- 供框架运行时模型绑定等场景使用(无需编译期泛型)
2026-08-18 00:27:22 +08:00
xrain 94f306e57a chore: 发布准备——修复 cjlint MANDATORY 错误 + 补 org 配置
publish 流程会执行 cjlint(error 即阻塞),修复:
- 测试枚举 Role.User 与类型名 User 冲突 → 改名 Role.Member(G.ENU.01)
- 测试用例函数补 : Unit 返回类型(G.DCL.02)
- JsonOption.instance 补显式类型(G.DCL.02)
- JsonReader.readParentFields 移除未使用 options 参数(G.FUN.02)
- Annotations.cj 移除硬编码 URL(G.OTH.03)
- 宏 FieldVisitor.visit 补 : Unit(G.DCL.02)
- cjpm.toml 增加 org = "simcu"(publish 自动写入)

cjpm bundle 已可成功生成 simapi_serialization-1.0.0.cjp,
剩余阻塞:中心仓认证(pkg.cangjie-lang.cn 需用户 token)
2026-08-17 14:19:44 +08:00
xrain b7301f9fa8 test: 新增三级继承用例(三层全标 @SerializerParent)
- threeLevelAllMacro:爷/父/子 每层字段都导出、反序列化全部回填
- threeLevelFieldSeparation:三层字段互不遮蔽、互不覆盖
- 新增模型 GrandAll → MidAll → LeafAll(每层标宏)
- 18 用例全绿
2026-08-17 14:12:07 +08:00
xrain f66b7805ab refactor: 测试移至独立子包 simapi_serialization.tests(src/tests/)
- JsonSerializer_test.cj 从 src/json/ 移至 src/tests/,包名 simapi_serialization.tests
- import 简化:测试包直接 import simapi_serialization.*(无循环依赖)
- 测试包不进入库产物(cjpm 自动排除 *_test.cj)
- 16 用例全绿
2026-08-17 14:11:25 +08:00
xrain c181ada90b docs: 新增 README——快速开始/注解/父类字段宏/选项/支持类型/包结构/测试
- 单 import 全量可用:import simapi_serialization.*
- @SerializerParent 父类字段序列化用法与特性
- JsonOption 选项、命名策略、支持类型、宽松转换、已知限制
- 全部示例经 serialization_test 实测验证
2026-08-17 14:10:30 +08:00
xrain f593f96d9a refactor: 新增 common 子包——XML/JSON 共用部分 + 单 import 全量可用
- src/common/(package simapi_serialization.common):
  Annotations.cj(@SerializerPropertyName/@SerializerIgnore)、
  ReflectionCache.cj(字段元数据 + 继承链缓存)、NamingPolicy.cj(PropertyNamingPolicy)
- 根锚点 public import common.* + json.*:import simapi_serialization.* 即可用全部
- JsonOption.propertyNamingPolicy 引用 common 枚举;getFields 改收命名策略
- 枚举值 PropertyNamingPolicy.None → Keep(None 与内置 Option.None 构造器同名冲突)
- JsonWriter/JsonReader 单类 import common,避免循环依赖
- 测试/独立项目验证:16 用例全绿;serialization_test 单 import 即可运行
2026-08-17 14:06:13 +08:00
xrain e24b73ee96 refactor: JsonAnnotations.cj 移至根目录改名 Annotations.cj
- 注解类 SerializerPropertyName/SerializerIgnore 从 simapi_serialization.json
  子包移至根包 simapi_serialization(文件 src/Annotations.cj)
- 打破循环依赖:根锚点不再 public import json 子包,序列化器由用户显式
  import simapi_serialization.json.*
- ReflectionCache / 测试文件补 import simapi_serialization.*
- serialization_test 同步补 import simapi_serialization.json.*
- 16 用例全绿
2026-08-17 14:00:47 +08:00
xrain 990f10f98c refactor: 注解与宏改名——Serializer 前缀统一命名
- @JsonPropertyName → @SerializerPropertyName
- @JsonIgnore → @SerializerIgnore
- @JsonParent → @SerializerParent(宏文件 JsonParentMacro.cj → SerializerParentMacro.cj)
- 同步更新:JsonAnnotations、ReflectionCache、宏内部注解判断、
  测试、方案文档、serialization_test 独立项目
- 16 用例全绿
2026-08-17 13:58:05 +08:00
xrain affadac6c2 feat: 实现 @JsonParent 宏——父类字段序列化/反序列化支持
- 新增 src/macros/JsonParentMacro.cj(macro package simapi_serialization.macros):
  标注父类自动补 open,收集 public var 字段(跳过 @JsonIgnore,
  @JsonPropertyName 用注解名),字符串拼接生成静态方法:
    exportJsonFields(instance: T): HashMap<String, Any>
    importJsonFields(instance: T, json: HashMap<String, Any>): Unit
- JsonWriter.writeParentFields:沿 superClass 链调用 exportJsonFields 合并父类字段
- JsonReader.readParentFields:沿 superClass 链调用 importJsonFields 回填父类字段
- ReflectionCache 增加 hasExportFields/hasImportFields 缓存(避免每次反射查找)
- 测试:16 用例全绿——新增 parentMacroMethods、multiLevelInheritance、
  parentAutoOpen;更新 objectSerialize/objectRoundTrip 断言父类字段输出
2026-08-17 13:41:16 +08:00
xrain 00fea9703c docs: 宏改名为 @JsonParent——简短且与 @JsonPropertyName/@JsonIgnore 前缀风格统一 2026-08-17 13:32:57 +08:00
xrain 24c5b1e1ba docs: 补充多层继承支持说明(已实测三层继承 + 中间层无宏跳过)
- §3.3 多层继承:库沿 superClass 链逐层调用每层 exportJsonFields,
  每层各导各的,中间层无宏自动跳过继续向上
- 实测:三层标宏 → 爷父字段均导出;中间层无宏 → 跳过仍导出祖父字段
- 与 soulsoft super 调用链的区别:本方案靠库侧遍历,宏生成更简单
- 测试计划补充中间层无宏用例
2026-08-17 13:16:49 +08:00
xrain fe1daec4f9 docs: @JsonExportFields 支持自动补 open(已实测)——非 open 类标注时宏自动加 open 修饰符
- 实测验证:宏展开的 open 在语义检查前生效,子类可正常继承
- 提供两种模式:默认自动补 open(推荐);requireOpen 严格模式非 open 报错
- 非 class 声明标注 → ASTException 编译期报错(已实测,错误定位到标注处)
- 测试计划更新为对应三条用例
2026-08-17 13:13:59 +08:00
xrain 7faea12a1e docs: 宏增加 open 校验——@JsonExportFields 仅允许标注 open class,否则编译期报错
- 遍历 ClassDecl.modifiers 检查 TokenKind.OPEN(参考 soulsoft Extensions.cj isOpen)
- 非 open class / 非 class 声明 → throw MacroException 编译期报错
- 测试计划补充两条校验用例
2026-08-17 13:11:19 +08:00
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