-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Open
Labels
area-System.Text.JsonbuguntriagedNew issue has not been triaged by the area ownerNew issue has not been triaged by the area owner
Description
Description
A property has a non-serializable type, but is attributed with a [JsonConverter] that can successfully handle that type. However, JsonSerializer is still trying to create a JsonTypeInfo for the non-serializable type, and fails because it's, well, non-serializable. In this case, that type has a ref property.
Reproduction Steps
using System.Text.Json;
using System.Text.Json.Serialization;
JsonSerializer.Serialize(new MyCollection());
class MyCollection
{
[JsonConverter(typeof(MyTestsConverter))]
public IList<MyTest> Tests { get; set; } = [];
}
class MyTest
{
public int Value1 { get; set; }
private int _value2;
public ref int Value2 => ref _value2;
}
class MyTestsConverter : JsonConverter<IList<MyTest>>
{
public override IList<MyTest>? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
return [];
}
public override void Write(Utf8JsonWriter writer, IList<MyTest> value, JsonSerializerOptions options)
{
writer.WriteStartArray();
writer.WriteEndArray();
}
}Expected behavior
Runs successfully.
Actual behavior
Unhandled exception. System.InvalidOperationException: The type 'System.Int32&' of property 'Value2' on type 'MyTest' is invalid for serialization or deserialization because it is a pointer type, is a ref struct, or contains generic parameters that have not been replaced by specific types.
at System.Text.Json.ThrowHelper.ThrowInvalidOperationException_CannotSerializeInvalidType(Type typeToConvert, Type declaringType, MemberInfo memberInfo)
at System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver.CreatePropertyInfo(JsonTypeInfo typeInfo, Type typeToConvert, MemberInfo memberInfo, NullabilityInfoContext nullabilityCtx, JsonSerializerOptions options, Boolean shouldCheckForRequiredKeyword, Boolean hasJsonIncludeAttribute)
at System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver.AddMembersDeclaredBySuperType(JsonTypeInfo typeInfo, Type currentType, NullabilityInfoContext nullabilityCtx, Boolean constructorHasSetsRequiredMembersAttribute, PropertyHierarchyResolutionState& state)
at System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver.PopulateProperties(JsonTypeInfo typeInfo, NullabilityInfoContext nullabilityCtx)
at System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver.CreateTypeInfoCore(Type type, JsonConverter converter, JsonSerializerOptions options)
at System.Text.Json.Serialization.Metadata.DefaultJsonTypeInfoResolver.GetTypeInfo(Type type, JsonSerializerOptions options)
at System.Text.Json.JsonSerializerOptions.GetTypeInfoNoCaching(Type type)
at System.Text.Json.JsonSerializerOptions.CachingContext.CreateCacheEntry(Type type, CachingContext context)
--- End of stack trace from previous location ---
at System.Text.Json.JsonSerializerOptions.GetTypeInfoInternal(Type type, Boolean ensureConfigured, Nullable`1 ensureNotNull, Boolean resolveIfMutable, Boolean fallBackToNearestAncestorType)
at System.Text.Json.Serialization.Metadata.JsonTypeInfo.Configure()
at System.Text.Json.Serialization.Metadata.JsonTypeInfo.<EnsureConfigured>g__ConfigureSynchronized|174_0()
at System.Text.Json.JsonSerializerOptions.GetTypeInfoInternal(Type type, Boolean ensureConfigured, Nullable`1 ensureNotNull, Boolean resolveIfMutable, Boolean fallBackToNearestAncestorType)
at System.Text.Json.Serialization.Metadata.JsonPropertyInfo.Configure()
at System.Text.Json.Serialization.Metadata.JsonTypeInfo.ConfigureProperties()
at System.Text.Json.Serialization.Metadata.JsonTypeInfo.Configure()
at System.Text.Json.Serialization.Metadata.JsonTypeInfo.<EnsureConfigured>g__ConfigureSynchronized|174_0()
at System.Text.Json.JsonSerializerOptions.GetTypeInfoInternal(Type type, Boolean ensureConfigured, Nullable`1 ensureNotNull, Boolean resolveIfMutable, Boolean fallBackToNearestAncestorType)
at System.Text.Json.JsonSerializerOptions.GetTypeInfoForRootType(Type type, Boolean fallBackToNearestAncestorType)
at System.Text.Json.JsonSerializer.GetTypeInfo[T](JsonSerializerOptions options)
at System.Text.Json.JsonSerializer.Serialize[TValue](TValue value, JsonSerializerOptions options)
at Program.<Main>$(String[] args)
Regression?
No
Known Workarounds
None
Configuration
.NET 10 (also repros on .NET 9 and .NET 8)
Other information
No response
Copilot
Metadata
Metadata
Assignees
Labels
area-System.Text.JsonbuguntriagedNew issue has not been triaged by the area ownerNew issue has not been triaged by the area owner