feat(cpp): add nested field codec support#3636
Merged
chaokunyang merged 8 commits intoapache:mainfrom Apr 29, 2026
Merged
Conversation
pandalee99
approved these changes
Apr 29, 2026
5 tasks
chaokunyang
added a commit
that referenced
this pull request
Apr 29, 2026
## Why? C# generated serializers need field-level schema descriptors that can describe the exact Fory wire type for scalars and nested containers. The previous `[Field(Encoding = ...)]` model only handled a narrow integer-encoding override, which was not expressive enough for nested annotated container metadata or compatible-mode skipping based on remote field metadata. ## What does this PR do? - Replaces the C# `[Field]` / `FieldEncoding` API with `[ForyField]`, supporting optional stable field ids and `Type = typeof(S...)` schema descriptors. - Adds `Apache.Fory.Schema.Types` descriptor marker types for scalar, packed-array, list, set, and map field metadata. - Extends the C# source generator to emit descriptor-driven field codecs for scalar, list, and map payloads, including nested generics and nullability-aware generated read/write helpers. - Updates compatible field skipping so C# consumes payloads according to remote nested field metadata, including scalar, packed array, list/set, and map descriptors. - Updates the Fory compiler C# generator to emit `[ForyField(Type = typeof(...))]` hints, including nested map/list descriptors and reduced-precision `Half` / `BFloat16` carriers. - Adds C# runtime, compiler-generator, and xlang peer coverage for unsigned schema descriptors and nested annotated containers, and moves the nested annotated container xlang checks to `CSharpXlangTest`. - Refreshes the C# README and field-configuration guide for the new `[ForyField]` descriptor API. ## Related issues #1017 #3630 #3625 #3630 #3636 ## AI Contribution Checklist - [ ] Substantial AI assistance was used in this PR: `yes` / `no` - [ ] If `yes`, I included a completed [AI Contribution Checklist](https://github.com/apache/fory/blob/main/AI_POLICY.md#9-contributor-checklist-for-ai-assisted-prs) in this PR description and the required `AI Usage Disclosure`. - [ ] If `yes`, my PR description includes the required `ai_review` summary and screenshot evidence of the final clean AI review results from both fresh reviewers on the current PR diff or current HEAD after the latest code changes. ## Does this PR introduce any user-facing change? - [ ] Does this PR introduce any public API change? - [ ] Does this PR introduce any binary protocol compatibility change? ## Benchmark
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why?
C++ needs field metadata that can describe nested container key, value, and element encodings so generated C++ xlang structs can match IDL and Java metadata for maps, lists, optional wrappers, and integer encodings.
What does this PR do?
FORY_STRUCTentries withfory::F(...)and adds recursivefory::Tvalue-node specs for scalar, list, set, map, and inner carrier nodes.FieldTypemetadata, including configured integer encodings inside lists, maps, and optionals.FORY_STRUCTmetadata instead of separateFORY_FIELD_CONFIGoutput and allows nested collections for the C++ target.Related issues
#1017
#3630
#3625
#3630
AI Contribution Checklist
yes/noyes, I included a completed AI Contribution Checklist in this PR description and the requiredAI Usage Disclosure.yes, my PR description includes the requiredai_reviewsummary and screenshot evidence of the final clean AI review results from both fresh reviewers on the current PR diff or current HEAD after the latest code changes.Does this PR introduce any user-facing change?
Yes. C++ users configure field metadata inline in
FORY_STRUCT, including nestedfory::Tspecs;FORY_UNIONcases also require explicitfory::F(id)metadata. This does not intentionally change the binary protocol; it enables C++ to emit and read existing nested xlang field metadata.Benchmark