Describe the bug
The C# generator removes required ModelReaderWriterBuildable attributes for ARM framework types represented by SystemObjectModelProvider, while generated serialization code still deserializes those types through the SDK's ModelReaderWriterContext.
This causes ModelReaderWriter.Read<T>(..., Context.Default) to throw at runtime because Context.GetTypeBuilder(typeof(T)) cannot find a builder.
This appears to be a regression from #11288 (89f388c405438d0f1785857da380c0817bffda17). That change introduced ProviderReferenceMapAnalyzer.IsResolvableBuildableType(), whose IsResolvableBuildableProvider() rejects every SystemObjectModelProvider:
private static bool IsResolvableBuildableProvider(TypeProvider provider) =>
provider is not SystemObjectModelProvider &&
provider is not ModelProvider { IsExternal: true } &&
ShouldWriteProvider(provider);
ModelReaderWriterContextDefinition.CollectBuildableTypesFromFrameworkType() now applies this filter before adding the framework type to the context.
Reproduction
Azure SDK full regeneration PR: Azure/azure-sdk-for-net#61331
In sdk/mysql/Azure.ResourceManager.MySql/src/Generated/Models/AzureResourceManagerMySqlContext.cs, regeneration removes:
[ModelReaderWriterBuildable(typeof(ManagedServiceIdentity))]
[ModelReaderWriterBuildable(typeof(ResponseError))]
[ModelReaderWriterBuildable(typeof(SystemData))]
However, the regenerated serialization code still contains six reads using that context:
ResponseError: 3 calls
ArmOperationStatusResourceProvisioningState.Serialization.cs
ErrorResponse.Serialization.cs
MySqlFlexibleServerBackupAndExportResult.Serialization.cs
SystemData: 2 calls
MySqlFlexibleServerBackupAndExportResult.Serialization.cs
MySqlFlexibleServerLogFile.Serialization.cs
ManagedServiceIdentity: 1 call
MySqlFlexibleServerPatch.Serialization.cs
For example:
identity = ModelReaderWriter.Read<ManagedServiceIdentity>(
data,
options,
AzureResourceManagerMySqlContext.Default);
ModelReaderWriter.Read calls context.GetTypeBuilder(returnType), so these paths fail with InvalidOperationException: No ModelReaderWriterTypeBuilder found ....
Expected behavior
Framework types represented by SystemObjectModelProvider should remain eligible for ModelReaderWriterBuildable when their wrapped SystemType implements IPersistableModel<T> or IJsonModel<T> and is referenced by retained serialization code.
Suggested fix
Update the resolvability check so a SystemObjectModelProvider is considered resolvable for MRW context generation when its wrapped SystemType supports MRW. Add regression coverage for a retained generated model whose serialization reads an external/system model through ModelReaderWriter.Read<T>(..., Context.Default).
Describe the bug
The C# generator removes required
ModelReaderWriterBuildableattributes for ARM framework types represented bySystemObjectModelProvider, while generated serialization code still deserializes those types through the SDK'sModelReaderWriterContext.This causes
ModelReaderWriter.Read<T>(..., Context.Default)to throw at runtime becauseContext.GetTypeBuilder(typeof(T))cannot find a builder.This appears to be a regression from #11288 (
89f388c405438d0f1785857da380c0817bffda17). That change introducedProviderReferenceMapAnalyzer.IsResolvableBuildableType(), whoseIsResolvableBuildableProvider()rejects everySystemObjectModelProvider:ModelReaderWriterContextDefinition.CollectBuildableTypesFromFrameworkType()now applies this filter before adding the framework type to the context.Reproduction
Azure SDK full regeneration PR: Azure/azure-sdk-for-net#61331
In
sdk/mysql/Azure.ResourceManager.MySql/src/Generated/Models/AzureResourceManagerMySqlContext.cs, regeneration removes:However, the regenerated serialization code still contains six reads using that context:
ResponseError: 3 callsArmOperationStatusResourceProvisioningState.Serialization.csErrorResponse.Serialization.csMySqlFlexibleServerBackupAndExportResult.Serialization.csSystemData: 2 callsMySqlFlexibleServerBackupAndExportResult.Serialization.csMySqlFlexibleServerLogFile.Serialization.csManagedServiceIdentity: 1 callMySqlFlexibleServerPatch.Serialization.csFor example:
ModelReaderWriter.Readcallscontext.GetTypeBuilder(returnType), so these paths fail withInvalidOperationException: No ModelReaderWriterTypeBuilder found ....Expected behavior
Framework types represented by
SystemObjectModelProvidershould remain eligible forModelReaderWriterBuildablewhen their wrappedSystemTypeimplementsIPersistableModel<T>orIJsonModel<T>and is referenced by retained serialization code.Suggested fix
Update the resolvability check so a
SystemObjectModelProvideris considered resolvable for MRW context generation when its wrappedSystemTypesupports MRW. Add regression coverage for a retained generated model whose serialization reads an external/system model throughModelReaderWriter.Read<T>(..., Context.Default).