diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Caching.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Caching.cs index af1c610e3ee573..1ae82bd892f326 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Caching.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Caching.cs @@ -284,18 +284,20 @@ public bool Equals(JsonSerializerOptions? left, JsonSerializerOptions? right) left._typeInfoResolver == right._typeInfoResolver && CompareLists(left._converters, right._converters); - static bool CompareLists(ConfigurationList left, ConfigurationList right) + static bool CompareLists(ConfigurationList? left, ConfigurationList? right) where TValue : class? { - int n; - if ((n = left.Count) != right.Count) + int leftCount = left is null ? 0 : left.Count; + int rightCount = right is null ? 0 : right.Count; + + if (leftCount != rightCount) { return false; } - for (int i = 0; i < n; i++) + for (int i = 0; i < leftCount; i++) { - if (left[i] != right[i]) + if (left![i] != right![i]) { return false; } @@ -331,12 +333,15 @@ public int GetHashCode(JsonSerializerOptions options) return hc.ToHashCode(); - static void AddListHashCode(ref HashCode hc, ConfigurationList list) + static void AddListHashCode(ref HashCode hc, ConfigurationList? list) { - int n = list.Count; - for (int i = 0; i < n; i++) + if (list != null) { - AddHashCode(ref hc, list[i]); + int n = list.Count; + for (int i = 0; i < n; i++) + { + AddHashCode(ref hc, list[i]); + } } } diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Converters.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Converters.cs index 14babcfc270dbb..55a7a4c5bd4e06 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Converters.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.Converters.cs @@ -20,7 +20,7 @@ public sealed partial class JsonSerializerOptions /// /// Once serialization or deserialization occurs, the list cannot be modified. /// - public IList Converters => _converters; + public IList Converters => _converters ??= new ConverterList(this); /// /// Returns the converter for the specified type. @@ -66,11 +66,14 @@ internal JsonConverter GetConverterInternal(Type typeToConvert) internal JsonConverter? GetConverterFromList(Type typeToConvert) { - foreach (JsonConverter item in _converters) + if (_converters != null) { - if (item.CanConvert(typeToConvert)) + foreach (JsonConverter item in _converters) { - return item; + if (item.CanConvert(typeToConvert)) + { + return item; + } } } diff --git a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.cs b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.cs index 698be489adf6ac..f89f21e10522f5 100644 --- a/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.cs +++ b/src/libraries/System.Text.Json/src/System/Text/Json/Serialization/JsonSerializerOptions.cs @@ -58,7 +58,7 @@ public static JsonSerializerOptions Default private JsonCommentHandling _readCommentHandling; private ReferenceHandler? _referenceHandler; private JavaScriptEncoder? _encoder; - private ConfigurationList _converters; + private ConfigurationList? _converters; private JsonIgnoreCondition _defaultIgnoreCondition; private JsonNumberHandling _numberHandling; private JsonUnknownTypeHandling _unknownTypeHandling; @@ -80,7 +80,6 @@ public static JsonSerializerOptions Default /// public JsonSerializerOptions() { - _converters = new ConverterList(this); TrackOptionsInstance(this); } @@ -102,7 +101,7 @@ public JsonSerializerOptions(JsonSerializerOptions options) _jsonPropertyNamingPolicy = options._jsonPropertyNamingPolicy; _readCommentHandling = options._readCommentHandling; _referenceHandler = options._referenceHandler; - _converters = new ConverterList(this, options._converters); + _converters = options._converters is null ? null : new ConverterList(this, options._converters); _encoder = options._encoder; _defaultIgnoreCondition = options._defaultIgnoreCondition; _numberHandling = options._numberHandling; @@ -121,9 +120,6 @@ public JsonSerializerOptions(JsonSerializerOptions options) EffectiveMaxDepth = options.EffectiveMaxDepth; ReferenceHandlingStrategy = options.ReferenceHandlingStrategy; - // _cachingContext is not copied as sharing the JsonTypeInfo and JsonPropertyInfo caches can result in - // unnecessary references to type metadata, potentially hindering garbage collection on the source options. - TrackOptionsInstance(this); }