| name | serde-code-review |
| description | Reviews serde serialization code for derive patterns, enum representations, custom implementations, and common serialization bugs. Use when reviewing Rust code that uses serde, serde_json, toml, or any serde-based serialization format. Covers attribute macros, field renaming, and format-specific pitfalls. |
Serde Code Review
Review Workflow
- Check Cargo.toml โ Note serde features (
derive, rc), format crates (serde_json, toml, bincode, etc.), and Rust edition (2024 has breaking changes affecting serde code)
- Check derive usage โ Verify
Serialize and Deserialize are derived appropriately
- Check enum representations โ Enum tagging affects wire format compatibility and readability
- Check field attributes โ Renaming, defaults, skipping affect API contracts
- Check edition 2024 compatibility โ Reserved
gen keyword, RPIT lifetime capture changes, never_type_fallback
- Verify round-trip correctness โ Serialized data must deserialize back to the same value
Gates (before reporting findings)
Run in order. Do not write a finding until the step that applies has passed.
-
Serde context on disk โ Pass when: You have read the relevant Cargo.toml (crate or workspace root) and can state Rust edition, serde / serde_derive features if non-default (derive, rc), and which format crates apply (serde_json, toml, bincode, etc.) for the code under review. Then apply edition-specific checklist items (e.g. gen, RPIT/never_type_fallback) only when that file supports them.
-
Per-finding evidence โ Pass when: Each issue cites [FILE:LINE] from the current tree for the struct/enum, Serialize/Deserialize impl, or attribute block in question (not from memory, docs-only, or another branch).
-
Category check vs protocol โ Pass when: For the finding type (derive attrs, enum tagging, flatten, custom impl, sqlx + serde alignment), you ran the matching checks from the review-verification-protocol skill (e.g. full type definition + serde attrs before โwrong representationโ; confirmed edition in Cargo.toml before edition-2024-only findings). Then add the finding.
-
Output shape โ Pass when: The report lines match Output Format below (severity + description).
Output Format
Report findings as:
[FILE:LINE] ISSUE_TITLE
Severity: Critical | Major | Minor | Informational
Description of the issue and why it matters.
Quick Reference
Review Checklist
Derive Usage
Enum Representation
Field Configuration
Database Integration (sqlx)
Edition 2024 Compatibility
Correctness
Severity Calibration
Critical
- Enum representation mismatch between serializer and deserializer (data loss)
- Missing
#[serde(rename)] causing API-breaking field name changes
#[serde(flatten)] causing silent key collisions
- Lossy numeric conversions (
f64 precision loss for monetary values)
Major
- Inconsistent
rename_all across related types (confusing API)
- Missing
skip_serializing_if causing null/empty noise in output
deny_unknown_fields on types consumed by evolving APIs (breaks forward compatibility)
- Missing round-trip tests for complex enum representations
- Field or variant named
gen without r#gen escape (edition 2024 compile failure)
Minor
- Unnecessary
#[serde(default)] on required fields
- Using string representation for enums when numeric would be more efficient
- Verbose custom implementations where derive + attributes suffice
- Using
#[allow(unused)] instead of #[expect(unused)] for serde-only fields (prefer self-cleaning lint suppression)
Informational
- Suggestions to switch enum representation for cleaner wire format
- Suggestions to add
#[non_exhaustive] alongside serde for forward compatibility
Valid Patterns (Do NOT Flag)
- Externally tagged enums โ serde's default, valid for many use cases
#[serde(untagged)] enums โ Valid when discriminated by structure, not by tag
serde_json::Value for dynamic data โ Appropriate for truly schema-less fields
#[serde(skip)] on computed fields โ Correct for derived/cached values
#[serde(with = "...")] for custom formats โ Standard for dates, UUIDs, etc.
r#gen with #[serde(rename = "gen")] โ Correct edition 2024 workaround for gen fields in wire formats
+ use<'a> on custom serializer return types โ Precise RPIT lifetime capture (edition 2024)
Before Submitting Findings
Complete Gates (before reporting findings) above; gate 3 incorporates the review-verification-protocol skill for serde-related issue types.