DOC-FULL-A7 P2 | Deserialize field rename 与 uniffi 兼容性验证 #96

Closed
opened 2026-06-07 20:04:19 +08:00 by wangdl · 1 comment
Owner

审查发现

F7: progress.rs 的 #[serde(rename)] 在 uniffi::Enum 上可能被覆盖。需验证从 camelCase JSON 反序列化是否正常。已通过 test_roundtrip 测试,但仅限 serde 路径。

M-DOC-FULL Batch 0 审查 issue。

## 审查发现 F7: progress.rs 的 #[serde(rename)] 在 uniffi::Enum 上可能被覆盖。需验证从 camelCase JSON 反序列化是否正常。已通过 test_roundtrip 测试,但仅限 serde 路径。 M-DOC-FULL Batch 0 审查 issue。
wangdl added this to the M-DOC-FULL:Document Runtime 完整阅读内核与学习事件协议 milestone 2026-06-07 20:04:19 +08:00
Author
Owner

验证完成

结论

#[serde(rename)] + #[derive(uniffi::Enum)] 共存无冲突。

验证方法

1. serde 路径(已验证)

  • test_deserialize_from_camel_case_json — 全部 6 种 variant 从 camelCase JSON 正确反序列化
  • test_deserialize_serialize_roundtrip_all_variants — camelCase→deserialize→serialize→deserialize 无损
  • test_rename_attrs_not_overridden_by_uniffi — 关键验证:snake_case 被拒绝(rename 生效),camelCase 被接受

2. uniffi 路径(已验证)

  • cargo check 编译无 uniffi::Enum 相关错误
  • uniffi 使用自己的序列化格式(非 serde),字段名来自 UDL 定义(snake_case)
  • UDL 中 ReadingPosition 字段使用 snake_case (block_id, scroll_progress 等),与 Rust 源码一致

关键测试

// snake_case 被拒绝 — 证明 rename 生效
let json = r#"{"type":"Markdown","block_id":"h1","scroll_progress":0.5}"#;
assert!(serde_json::from_str::<ReadingPosition>(json).is_err());

// camelCase 被接受
let json = r#"{"type":"Markdown","blockId":"h1","scrollProgress":0.5}"#;
assert!(serde_json::from_str::<ReadingPosition>(json).is_ok());

验证

cargo test progress — 11 passed
cargo test --all — 163 passed, 0 failed
## 验证完成 ### 结论 `#[serde(rename)]` + `#[derive(uniffi::Enum)]` 共存无冲突。 ### 验证方法 **1. serde 路径(已验证)** - `test_deserialize_from_camel_case_json` — 全部 6 种 variant 从 camelCase JSON 正确反序列化 - `test_deserialize_serialize_roundtrip_all_variants` — camelCase→deserialize→serialize→deserialize 无损 - `test_rename_attrs_not_overridden_by_uniffi` — 关键验证:snake_case 被拒绝(rename 生效),camelCase 被接受 **2. uniffi 路径(已验证)** - `cargo check` 编译无 `uniffi::Enum` 相关错误 - uniffi 使用自己的序列化格式(非 serde),字段名来自 UDL 定义(snake_case) - UDL 中 `ReadingPosition` 字段使用 snake_case (`block_id`, `scroll_progress` 等),与 Rust 源码一致 ### 关键测试 ```rust // snake_case 被拒绝 — 证明 rename 生效 let json = r#"{"type":"Markdown","block_id":"h1","scroll_progress":0.5}"#; assert!(serde_json::from_str::<ReadingPosition>(json).is_err()); // camelCase 被接受 let json = r#"{"type":"Markdown","blockId":"h1","scrollProgress":0.5}"#; assert!(serde_json::from_str::<ReadingPosition>(json).is_ok()); ``` ### 验证 ``` cargo test progress — 11 passed cargo test --all — 163 passed, 0 failed ```
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangdl/zhixi-document-runtime#96
No description provided.