Skip to content

Potential size reduction opportunities in System.Text.Json NativeAOT #80917

Open
@eiriktsarpalis

Description

@eiriktsarpalis

The PR in #80755 attempted to reduce the size of System.Text.Json components in trimmed NativeAOT binaries. The per-namespace breakdown in #80755 (comment) shows that there might be opportunity to further reduce application size in the System.Text.Json.Serialization.Metadata namespace, which currently occupies approximately 600k in the Golidlocks app. More specifically, the metadata layer introduces overhead in a couple of ways:

  1. Using separate JsonTypeInfo<T> implementations for source gen and reflection. This segregation largely exists for historical reasons and it could be removed, decoupling JsonTypeInfo<T> metadata from contract resolution behavior.
  2. The source generator sets JsonTypeInfo metadata using the JsonMetadataServices APIs as a proxy. This happens because the source generator predates the public APIs on JsonTypeInfo itself. The proxy API introduces a number of generic classes such as JsonCollectionInfoValues<T>, JsonObjectInfoValues<T> and JsonPropertyInfoValues<T>. All these types could be trimmed if we updated the source generator to call into the JsonTypeInfo APIs directly. Note that this is currently blocked by Add support for parameterized constructors in System.Text.Json contract customization (converters) #71944, the only remaining configuration point available in JsonMetadataServices but not yet present in JsonTypeInfo<T>.

cc @eerhardt @krwq @layomia

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-System.Text.Jsonpartner-impactThis issue impacts a partner who needs to be kept updatedsize-reductionIssues impacting final app size primary for size sensitive workloads

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions