Skip to content

Use GetUtf8Bytes for remaining C# JSON deserialization paths - #11951

Open
JoshLove-msft with Copilot wants to merge 2 commits into
mainfrom
copilot/generated-serialization-improvement
Open

Use GetUtf8Bytes for remaining C# JSON deserialization paths#11951
JoshLove-msft with Copilot wants to merge 2 commits into
mainfrom
copilot/generated-serialization-improvement

Conversation

Copilot AI commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

Raw-JSON deserialization still round-trips UTF-8 through a UTF-16 string in several paths. Reusing GetUtf8Bytes() avoids that transcoding on .NET 9+ via JsonMarshal.GetRawUtf8Value.

  • Deserialization: Extend the helper already used for nested models to raw BinaryData, byte[], Stream, and BinaryData collection values.
  • Compatibility: Preserve Base64 decoding, null handling, and the older-framework fallback.
  • Coverage: Update generated baselines and cover UTF-8 fidelity, document disposal, and invalid elements.
// Before
data = BinaryData.FromString(prop.Value.GetRawText());

// After
data = prop.Value.GetUtf8Bytes();

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 1 pipeline(s).
1 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

…alization

Co-authored-by: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com>
@microsoft-github-policy-service microsoft-github-policy-service Bot added the emitter:client:csharp Issue for the C# client emitter: @typespec/http-client-csharp label Sep 11, 2026
Copilot AI changed the title [WIP] Enhance generated serialization using JsonMarshal.GetRawUtf8Value Use GetUtf8Bytes for remaining C# JSON deserialization paths Sep 11, 2026
Copilot AI requested a review from JoshLove-msft September 11, 2026 23:53
@JoshLove-msft
JoshLove-msft marked this pull request as ready for review September 11, 2026 23:55
Copilot AI lite review requested due to automatic review settings September 11, 2026 23:55
@pkg-pr-new

pkg-pr-new Bot commented Sep 11, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@typespec/http-client-csharp@11951

commit: 0963e8c

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

No unresolved blocking issues were identified.

Pull request overview

Updates C# JSON deserialization to preserve raw UTF-8 bytes and avoid unnecessary UTF-16 transcoding on .NET 9+.

Changes:

  • Uses GetUtf8Bytes() for raw BinaryData, byte arrays, streams, and collections.
  • Preserves Base64, null, and older-framework fallback behavior.
  • Adds UTF-8, disposal, and invalid-element coverage; refreshes generated baselines.
File summaries
File Summary
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/Wrapper.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/UnknownPlant.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/UnknownPet.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/UnknownAnimal.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/Tree.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/Thing.Serialization.cs Updates raw union and property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/StreamingItem.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/RoundTripModel.Serialization.cs Updates raw and dictionary values.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ReturnsAnonymousModelResponse.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/RenamedModelCustom.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/PageThing.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ModelWithRequiredNullableProperties.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ModelWithEmbeddedNonBodyParameters.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithStringNextLinkResponse.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithNextLinkResponse.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenResponse.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/ListWithContinuationTokenHeaderResponseResponse.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetWidgetMetricsResponse.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/GetNotebookResponse.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/Friend.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/DynamicModel.Serialization.cs Updates unknown-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local/Sample-TypeSpec/src/Generated/Models/Dog.Serialization.cs Updates raw-property deserialization.
packages/http-client-csharp/generator/TestProjects/Local.Tests/ModelSerializationExtensionsTests.cs Adds UTF-8 fidelity and lifecycle tests.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/ListOfValueTypeUsesJsonDoc(BinaryData).cs Updates collection baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/TestData/ScmMethodProviderCollectionTests/DictionaryOfValueTypeUsesJsonDoc(BinaryData).cs Updates dictionary baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/ReadOnlyMemPropertyType.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanReplaceSerializationMethod.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanPreserveArrayEncodingForCustomizedProperty.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanCustomizeSerializationMethodForRenamedProperty.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanCustomizeSerializationMethodForPropertyInBase.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanCustomizeSerializationMethod.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanCustomizePropertyUsingField.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanCustomizeLiteralExtensibleEnum(string,foo).cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanCustomizeLiteralExtensibleEnum(int32,1).cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanCustomizeExtensibleEnum(string).cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanCustomizeExtensibleEnum(int32).cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanCustomizeDeserializationMethodWithoutOptions.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanCustomizeDeserializationMethodWithOptions.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanChangePropertySerializedName.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanChangePropertyNameAndRedefineOriginal.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanChangePropertyName.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanChangeListOfEnumPropToListOfExtensibleEnum.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/SerializationCustomizationTests/CanChangeDictionaryToBinaryData.cs Updates raw binary deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/MrwSerializationTypeDefinitionTests/IsExactNamePropertySerializationUsesExactName(deserialize).cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/MrwSerializationTypeDefinitionTests/IsExactNameModelSerializationUsesExactName.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/MrwSerializationTypeDefinitionTests/GetUtf8BytesIsUsedForMrwFallback.cs Updates fallback baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/ModelCustomizationTests/DoesNotOverrideMethodsIfBaseTypeIsNotModel.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/ModelCustomizationTests/CanCustomizeUriProperty.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/ModelCustomizationTests/CanCustomizeStringToFixedEnum.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/ModelCustomizationTests/CanCustomizePropertyIntoReadOnlyMemory.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/ModelCustomizationTests/CanCustomizeNullableStringToFixedEnum.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/ModelCustomizationTests/CanCustomizeGuidProperty.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/ModelCustomizationTests/CanCustomizeFixedEnumString.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/ModelCustomizationTests/CanCustomizeEnumToFrameworkType.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/ModelCustomizationTests/CanCustomizeEnumToFieldFrameworkType.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/ModelCustomizationTests/CanCustomizeBaseType.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/DynamicModelSerializationTests/DeserializeModelWithBinaryDataAdditionalPropsBackCompat.cs Updates additional-property baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/DynamicModelSerializationTests/DeserializeModelPropertyType.cs Updates raw property baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/DiscriminatorTests/TestUnknownNestedDiscriminatorCastsToInterfaceType.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/DeserializationTests/TestDeserializationOfDurationMillisecondsIntegerWireType(Integer).cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/DeserializationTests/TestDeserializationOfDurationMillisecondsIntegerWireType(Int64).cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/DeserializationTests/TestDeserializationOfDurationMillisecondsIntegerWireType(Int32).cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/DeserializationTests/RequiredFileBinaryContentProperty.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/DeserializationTests/OptionalFileBinaryContentProperty.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/TestData/DeserializationTests/DeserializeStruct.cs Updates generated deserialization baseline.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/MrwSerializationTypeDefinitions/MrwSerializationTypeDefinitionTests.cs Covers raw binary, byte-array, and stream paths.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/ScmMethodProviderCollection.cs Uses raw UTF-8 bytes for collection elements.
packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/MrwSerializationTypeDefinition.cs Uses raw UTF-8 bytes for framework value deserialization.
Review details
  • Files reviewed: 46/68 changed files
  • Comments generated: 0
  • Review effort level: Lite

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

emitter:client:csharp Issue for the C# client emitter: @typespec/http-client-csharp

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Generated serialization should use JsonMarshal.GetRawUtf8Value extension for better perf on net9.0+

3 participants