<PackageReference Include="System.Text.Json" Version="10.0.0-preview.2.25163.2" />
RootLevelListConverter<T>
using System.
Collections.
Generic;
using System.
Runtime.
CompilerServices;
using System.
Text.
Json.
Serialization.
Metadata;
namespace System.
Text.
Json.
Serialization.
Converters
{
internal sealed class RootLevelListConverter<
T> :
JsonResumableConverter<
List<
T>>
{
private readonly JsonTypeInfo<
T>
_elementTypeInfo;
internal override Type ElementType =>
typeof(
T);
private protected sealed override ConverterStrategy GetDefaultConverterStrategy()
{
return ConverterStrategy.
Enumerable;
}
public RootLevelListConverter(
JsonTypeInfo<
T>
elementTypeInfo)
{
base.
IsRootLevelMultiContentStreamingConverter =
true;
_elementTypeInfo =
elementTypeInfo;
}
internal override bool OnTryRead(
ref Utf8JsonReader reader,
Type typeToConvert,
JsonSerializerOptions options, [
System.
Runtime.
CompilerServices.
ScopedRef]
ref ReadStack state,
out List<
T>
value)
{
JsonConverter<
T>
effectiveConverter =
_elementTypeInfo.
EffectiveConverter;
state.
Current.
JsonPropertyInfo =
_elementTypeInfo.
PropertyInfoForTypeInfo;
List<
T>
list = (
List<
T>)
state.
Current.
ReturnValue;
while (
true) {
if ((
int)
state.
Current.
PropertyState <
3) {
if (!
ref reader.
TryAdvanceToNextRootLevelValueWithOptionalReadAhead(
effectiveConverter.
RequiresReadAhead,
out bool isAtEndOfStream)) {
if (
isAtEndOfStream) {
value =
list;
return true;
}
value =
null;
return false;
}
state.
Current.
PropertyState =
StackFramePropertyState.
ReadValue;
}
if (!
effectiveConverter.
TryRead(
ref reader,
typeof(
T),
options,
ref state,
out T value2,
out bool _))
break;
if (
list ==
null)
list = (
List<
T>)(
state.
Current.
ReturnValue =
new List<
T>());
list.
Add(
value2);
state.
Current.
EndElement();
}
value =
null;
return false;
}
}
}