Skip to content

feat(cpp): add nested field codec support#3636

Merged
chaokunyang merged 8 commits intoapache:mainfrom
chaokunyang:support_nested_container_field_for_cpp
Apr 29, 2026
Merged

feat(cpp): add nested field codec support#3636
chaokunyang merged 8 commits intoapache:mainfrom
chaokunyang:support_nested_container_field_for_cpp

Conversation

@chaokunyang
Copy link
Copy Markdown
Collaborator

@chaokunyang chaokunyang commented Apr 29, 2026

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?

  • Embeds field metadata directly in FORY_STRUCT entries with fory::F(...) and adds recursive fory::T value-node specs for scalar, list, set, map, and inner carrier nodes.
  • Make C++ struct and union serialization/type metadata paths to honor nested specs when writing, reading, and building FieldType metadata, including configured integer encodings inside lists, maps, and optionals.
  • Updates the C++ IDL generator to emit inline FORY_STRUCT metadata instead of separate FORY_FIELD_CONFIG output and allows nested collections for the C++ target.
  • Updates C++ docs, README examples, benchmark structs, and polymorphism/xlang guides to use the inline field configuration style.
  • Adds compiler, C++ struct, C++ xlang, and Java CPP xlang coverage for nested annotated containers in schema-consistent and compatible modes.

Related issues

#1017
#3630
#3625
#3630

AI Contribution Checklist

  • Substantial AI assistance was used in this PR: yes / no
  • If yes, I included a completed AI Contribution Checklist 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?

Yes. C++ users configure field metadata inline in FORY_STRUCT, including nested fory::T specs; FORY_UNION cases also require explicit fory::F(id) metadata. This does not intentionally change the binary protocol; it enables C++ to emit and read existing nested xlang field metadata.

  • Does this PR introduce any public API change?
  • Does this PR introduce any binary protocol compatibility change?

Benchmark

@chaokunyang chaokunyang merged commit 112a6e4 into apache:main Apr 29, 2026
65 checks passed
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants