diff --git a/src/libraries/System.Text.Json/src/System.Text.Json.csproj b/src/libraries/System.Text.Json/src/System.Text.Json.csproj
index 0373251d6fda4a..1b9fbb39d70613 100644
--- a/src/libraries/System.Text.Json/src/System.Text.Json.csproj
+++ b/src/libraries/System.Text.Json/src/System.Text.Json.csproj
@@ -122,6 +122,7 @@ System.Text.Json.Nodes.JsonValue
+
@@ -165,6 +166,7 @@ System.Text.Json.Nodes.JsonValue
+
@@ -189,7 +191,6 @@ System.Text.Json.Nodes.JsonValue
-
diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/ConverterStrategy.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/ConverterStrategy.cs
index 7ef9b3bf9eb87b..00cd124305b919 100644
--- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/ConverterStrategy.cs
+++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/ConverterStrategy.cs
@@ -12,15 +12,25 @@ namespace System.Text.Json
///
internal enum ConverterStrategy : byte
{
- // Default - no class type.
+ ///
+ /// Default value; not used by any converter.
+ ///
None = 0x0,
- // JsonObjectConverter<> - objects with properties.
+ ///
+ /// Objects with properties.
+ ///
Object = 0x1,
- // JsonConverter<> - simple values.
+ ///
+ /// Simple values or user-provided custom converters.
+ ///
Value = 0x2,
- // JsonIEnumerableConverter<> - all enumerable collections except dictionaries.
+ ///
+ /// Enumerable collections except dictionaries.
+ ///
Enumerable = 0x8,
- // JsonDictionaryConverter<,> - dictionary types.
+ ///
+ /// Dictionary types.
+ ///
Dictionary = 0x10,
}
}
diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Collection/JsonCollectionConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Collection/JsonCollectionConverter.cs
index 6d3a805cdf3749..05184a325d949e 100644
--- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Collection/JsonCollectionConverter.cs
+++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Collection/JsonCollectionConverter.cs
@@ -180,7 +180,7 @@ internal override bool OnTryRead(
{
state.Current.PropertyState = StackFramePropertyState.ReadValue;
- if (!SingleValueReadWithReadAhead(elementConverter.ConverterStrategy, ref reader, ref state))
+ if (!SingleValueReadWithReadAhead(elementConverter.RequiresReadAhead, ref reader, ref state))
{
value = default;
return false;
@@ -269,12 +269,8 @@ internal override bool OnTryWrite(
state.Current.ProcessedStartToken = true;
if (options.ReferenceHandlingStrategy == ReferenceHandlingStrategy.Preserve)
{
- MetadataPropertyName metadata = JsonSerializer.WriteReferenceForCollection(this, value, ref state, writer);
- if (metadata == MetadataPropertyName.Ref)
- {
- return true;
- }
-
+ MetadataPropertyName metadata = JsonSerializer.WriteReferenceForCollection(this, ref state, writer);
+ Debug.Assert(metadata != MetadataPropertyName.Ref);
state.Current.MetadataPropertyName = metadata;
}
else
diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Collection/JsonDictionaryConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Collection/JsonDictionaryConverter.cs
index b086d954ca3b54..9782a0a8f8e91b 100644
--- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Collection/JsonDictionaryConverter.cs
+++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Collection/JsonDictionaryConverter.cs
@@ -239,7 +239,7 @@ internal sealed override bool OnTryRead(
{
state.Current.PropertyState = StackFramePropertyState.ReadValue;
- if (!SingleValueReadWithReadAhead(_valueConverter.ConverterStrategy, ref reader, ref state))
+ if (!SingleValueReadWithReadAhead(_valueConverter.RequiresReadAhead, ref reader, ref state))
{
state.Current.DictionaryKey = key;
value = default;
@@ -311,10 +311,8 @@ internal sealed override bool OnTryWrite(
writer.WriteStartObject();
if (options.ReferenceHandlingStrategy == ReferenceHandlingStrategy.Preserve)
{
- if (JsonSerializer.WriteReferenceForObject(this, dictionary, ref state, writer) == MetadataPropertyName.Ref)
- {
- return true;
- }
+ MetadataPropertyName propertyName = JsonSerializer.WriteReferenceForObject(this, ref state, writer);
+ Debug.Assert(propertyName != MetadataPropertyName.Ref);
}
state.Current.JsonPropertyInfo = state.Current.JsonTypeInfo.ElementTypeInfo!.PropertyInfoForTypeInfo;
diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/FSharp/FSharpOptionConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/FSharp/FSharpOptionConverter.cs
index e8d78a55700c2b..9614e8492a52dc 100644
--- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/FSharp/FSharpOptionConverter.cs
+++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/FSharp/FSharpOptionConverter.cs
@@ -29,11 +29,11 @@ public FSharpOptionConverter(JsonConverter elementConverter)
_optionValueGetter = FSharpCoreReflectionProxy.Instance.CreateFSharpOptionValueGetter();
_optionConstructor = FSharpCoreReflectionProxy.Instance.CreateFSharpOptionSomeConstructor();
- // temporary workaround for JsonConverter base constructor needing to access
- // ConverterStrategy when calculating `CanUseDirectReadOrWrite`.
- // TODO move `CanUseDirectReadOrWrite` from JsonConverter to JsonTypeInfo.
- _converterStrategy = _elementConverter.ConverterStrategy;
- CanUseDirectReadOrWrite = _converterStrategy == ConverterStrategy.Value;
+ // Workaround for the base constructor depending on the (still unset) ConverterStrategy
+ // to derive the CanUseDirectReadOrWrite and RequiresReadAhead values.
+ _converterStrategy = elementConverter.ConverterStrategy;
+ CanUseDirectReadOrWrite = elementConverter.CanUseDirectReadOrWrite;
+ RequiresReadAhead = elementConverter.RequiresReadAhead;
}
internal override bool OnTryRead(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, ref ReadStack state, out TOption? value)
diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/FSharp/FSharpValueOptionConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/FSharp/FSharpValueOptionConverter.cs
index b11c346dc8df14..ccafcdf180e1b6 100644
--- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/FSharp/FSharpValueOptionConverter.cs
+++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/FSharp/FSharpValueOptionConverter.cs
@@ -29,11 +29,11 @@ public FSharpValueOptionConverter(JsonConverter elementConverter)
_optionValueGetter = FSharpCoreReflectionProxy.Instance.CreateFSharpValueOptionValueGetter();
_optionConstructor = FSharpCoreReflectionProxy.Instance.CreateFSharpValueOptionSomeConstructor();
- // temporary workaround for JsonConverter base constructor needing to access
- // ConverterStrategy when calculating `CanUseDirectReadOrWrite`.
- // TODO move `CanUseDirectReadOrWrite` from JsonConverter to JsonTypeInfo.
- _converterStrategy = _elementConverter.ConverterStrategy;
- CanUseDirectReadOrWrite = _converterStrategy == ConverterStrategy.Value;
+ // Workaround for the base constructor depending on the (still unset) ConverterStrategy
+ // to derive the CanUseDirectReadOrWrite and RequiresReadAhead values.
+ _converterStrategy = elementConverter.ConverterStrategy;
+ CanUseDirectReadOrWrite = elementConverter.CanUseDirectReadOrWrite;
+ RequiresReadAhead = elementConverter.RequiresReadAhead;
}
internal override bool OnTryRead(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, ref ReadStack state, out TValueOption value)
diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ObjectConverter.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Object/ObjectConverter.cs
similarity index 55%
rename from src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ObjectConverter.cs
rename to src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Object/ObjectConverter.cs
index 7ce4a2cb706b55..90d413dffd2e71 100644
--- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Value/ObjectConverter.cs
+++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/Converters/Object/ObjectConverter.cs
@@ -7,6 +7,15 @@ namespace System.Text.Json.Serialization.Converters
{
internal sealed class ObjectConverter : JsonConverter