LargeObjectWithParameterizedConstructorConverter<T>
sealed class LargeObjectWithParameterizedConstructorConverter<T> : ObjectWithParameterizedConstructorConverter<T>
using System.Buffers;
namespace System.Text.Json.Serialization.Converters
{
internal sealed class LargeObjectWithParameterizedConstructorConverter<T> : ObjectWithParameterizedConstructorConverter<T>
{
protected override bool ReadAndCacheConstructorArgument(ref ReadStack state, ref Utf8JsonReader reader, JsonParameterInfo jsonParameterInfo)
{
object argument;
bool flag = jsonParameterInfo.ReadJson(ref state, ref reader, out argument);
if (flag)
((object[])state.Current.CtorArgumentState.Arguments)[jsonParameterInfo.Position] = argument;
return flag;
}
protected override object CreateObject(ref ReadStackFrame frame)
{
object[] array = (object[])frame.CtorArgumentState.Arguments;
JsonClassInfo.ParameterizedConstructorDelegate<T> parameterizedConstructorDelegate = (JsonClassInfo.ParameterizedConstructorDelegate<T>)frame.JsonClassInfo.CreateObjectWithParameterizedCtor;
if (parameterizedConstructorDelegate == null)
ThrowHelper.ThrowNotSupportedException_ConstructorMaxOf64Parameters(base.ConstructorInfo, TypeToConvert);
object result = parameterizedConstructorDelegate(array);
ArrayPool<object>.Shared.Return(array, true);
return result;
}
protected override void InitializeConstructorArgumentCaches(ref ReadStack state, JsonSerializerOptions options)
{
JsonClassInfo jsonClassInfo = state.Current.JsonClassInfo;
if (jsonClassInfo.CreateObjectWithParameterizedCtor == null)
jsonClassInfo.CreateObjectWithParameterizedCtor = options.MemberAccessorStrategy.CreateParameterizedConstructor<T>(base.ConstructorInfo);
object[] array = ArrayPool<object>.Shared.Rent(jsonClassInfo.ParameterCount);
foreach (JsonParameterInfo value in jsonClassInfo.ParameterCache.Values) {
if (value.ShouldDeserialize)
array[value.Position] = value.DefaultValue;
}
state.Current.CtorArgumentState.Arguments = array;
}
}
}