| File: System\Text\Json\Serialization\Converters\Collection\ListOfTConverter.cs | Web Access |
| Project: src\runtime\src\libraries\System.Text.Json\src\System.Text.Json.csproj (System.Text.Json) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; using System.Diagnostics; namespace System.Text.Json.Serialization.Converters { /// Converter for <cref>System.Collections.Generic.List{TElement}</cref>. internal sealed class ListOfTConverter<TCollection, TElement> : IEnumerableDefaultConverter<TCollection, TElement> where TCollection : List<TElement> { internal override bool CanPopulate => true; protected override void Add(in TElement value, ref ReadStack state) { ((TCollection)state.Current.ReturnValue!).Add(value); } protected override void CreateCollection(ref Utf8JsonReader reader, scoped ref ReadStack state, JsonSerializerOptions options) { if (state.ParentProperty?.TryGetPrePopulatedValue(ref state) == true) { return; } if (state.Current.JsonTypeInfo.CreateObject is null) { ThrowHelper.ThrowNotSupportedException_SerializationNotSupported(state.Current.JsonTypeInfo.Type); } state.Current.ReturnValue = state.Current.JsonTypeInfo.CreateObject(); } protected override bool OnWriteResume(Utf8JsonWriter writer, TCollection value, JsonSerializerOptions options, ref WriteStack state) { List<TElement> list = value; // Using an index is 2x faster than using an enumerator. int index = state.Current.EnumeratorIndex; JsonConverter<TElement> elementConverter = GetElementConverter(ref state); if (elementConverter.CanUseDirectReadOrWrite && state.Current.NumberHandling is null) { // Fast path that avoids validation and extra indirection. for (; index < list.Count; index++) { elementConverter.Write(writer, list[index], options); } } else { for (; index < list.Count; index++) { TElement element = list[index]; if (!elementConverter.TryWrite(writer, element, options, ref state)) { state.Current.EnumeratorIndex = index; return false; } state.Current.EndCollectionElement(); if (ShouldFlush(ref state, writer)) { state.Current.EnumeratorIndex = ++index; return false; } } } return true; } } }