Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
JsonCollectionConverter.cs
Go to the documentation of this file.
3
5
6internal abstract class JsonCollectionConverter<TCollection, TElement> : JsonResumableConverter<TCollection>
7{
8 internal sealed override ConverterStrategy ConverterStrategy => ConverterStrategy.Enumerable;
9
10 internal override Type ElementType => typeof(TElement);
11
12 protected abstract void Add(in TElement value, ref ReadStack state);
13
15
19
21 {
22 return (JsonConverter<TElement>)elementTypeInfo.PropertyInfoForTypeInfo.ConverterBase;
23 }
24
26 {
27 return (JsonConverter<TElement>)state.Current.DeclaredJsonPropertyInfo.ConverterBase;
28 }
29
31 {
32 JsonTypeInfo elementTypeInfo = state.Current.JsonTypeInfo.ElementTypeInfo;
33 if (state.UseFastPath)
34 {
35 if (reader.TokenType != JsonTokenType.StartArray)
36 {
38 }
41 if (elementConverter.CanUseDirectReadOrWrite && !state.Current.NumberHandling.HasValue)
42 {
43 while (true)
44 {
45 reader.ReadWithVerify();
46 if (reader.TokenType == JsonTokenType.EndArray)
47 {
48 break;
49 }
50 TElement value2 = elementConverter.Read(ref reader, elementConverter.TypeToConvert, options);
52 }
53 }
54 else
55 {
56 while (true)
57 {
58 reader.ReadWithVerify();
59 if (reader.TokenType == JsonTokenType.EndArray)
60 {
61 break;
62 }
63 elementConverter.TryRead(ref reader, typeof(TElement), options, ref state, out var value3);
65 }
66 }
67 }
68 else
69 {
71 if (state.Current.ObjectState == StackFrameObjectState.None)
72 {
73 if (reader.TokenType == JsonTokenType.StartArray)
74 {
76 }
77 else if (flag)
78 {
79 if (reader.TokenType != JsonTokenType.StartObject)
80 {
82 }
84 }
85 else
86 {
88 }
89 }
90 if (flag && (int)state.Current.ObjectState < 14)
91 {
92 if (!JsonSerializer.ResolveMetadataForJsonArray<TCollection>(ref reader, ref state, options))
93 {
94 value = default(TCollection);
95 return false;
96 }
97 if (state.Current.ObjectState == StackFrameObjectState.ReadRefEndObject)
98 {
99 value = (TCollection)state.Current.ReturnValue;
100 return true;
101 }
102 }
103 if ((int)state.Current.ObjectState < 15)
104 {
106 state.Current.JsonPropertyInfo = state.Current.JsonTypeInfo.ElementTypeInfo.PropertyInfoForTypeInfo;
108 }
109 if ((int)state.Current.ObjectState < 16)
110 {
112 while (true)
113 {
114 if ((int)state.Current.PropertyState < 3)
115 {
118 {
119 value = default(TCollection);
120 return false;
121 }
122 }
123 if ((int)state.Current.PropertyState < 4)
124 {
125 if (reader.TokenType == JsonTokenType.EndArray)
126 {
127 break;
128 }
130 }
131 if ((int)state.Current.PropertyState < 5)
132 {
133 if (!elementConverter2.TryRead(ref reader, typeof(TElement), options, ref state, out var value4))
134 {
135 value = default(TCollection);
136 return false;
137 }
139 state.Current.EndElement();
140 }
141 }
143 }
144 if ((int)state.Current.ObjectState < 17)
145 {
147 if (state.Current.ValidateEndTokenOnArray && !reader.Read())
148 {
149 value = default(TCollection);
150 return false;
151 }
152 }
153 if ((int)state.Current.ObjectState < 18 && state.Current.ValidateEndTokenOnArray && reader.TokenType != JsonTokenType.EndObject)
154 {
156 }
157 }
159 value = (TCollection)state.Current.ReturnValue;
160 return true;
161 }
162
164 {
165 bool flag;
166 if (value == null)
167 {
168 writer.WriteNullValue();
169 flag = true;
170 }
171 else
172 {
173 if (!state.Current.ProcessedStartToken)
174 {
176 if (options.ReferenceHandlingStrategy == ReferenceHandlingStrategy.Preserve)
177 {
180 {
181 return true;
182 }
184 }
185 else
186 {
187 writer.WriteStartArray();
188 }
189 state.Current.DeclaredJsonPropertyInfo = state.Current.JsonTypeInfo.ElementTypeInfo.PropertyInfoForTypeInfo;
190 }
192 if (flag && !state.Current.ProcessedEndToken)
193 {
195 writer.WriteEndArray();
196 if (state.Current.MetadataPropertyName == MetadataPropertyName.Id)
197 {
198 writer.WriteEndObject();
199 }
200 }
201 }
202 return flag;
203 }
204
206
211}
static MetadataPropertyName WriteReferenceForCollection(JsonConverter jsonConverter, object currentValue, ref WriteStack state, Utf8JsonWriter writer)
bool OnWriteResume(Utf8JsonWriter writer, TCollection value, JsonSerializerOptions options, ref WriteStack state)
static JsonConverter< TElement > GetElementConverter(JsonTypeInfo elementTypeInfo)
virtual void ConvertCollection(ref ReadStack state, JsonSerializerOptions options)
static JsonConverter< TElement > GetElementConverter(ref WriteStack state)
void CreateCollection(ref Utf8JsonReader reader, ref ReadStack state, JsonSerializerOptions options)
override void CreateInstanceForReferenceResolver(ref Utf8JsonReader reader, ref ReadStack state, JsonSerializerOptions options)
override bool OnTryRead(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, ref ReadStack state, [MaybeNullWhen(false)] out TCollection value)
void Add(in TElement value, ref ReadStack state)
override bool OnTryWrite(Utf8JsonWriter writer, TCollection value, JsonSerializerOptions options, ref WriteStack state)
static bool SingleValueReadWithReadAhead(ConverterStrategy converterStrategy, ref Utf8JsonReader reader, ref ReadStack state)
JsonTypeInfo(Type type, JsonSerializerOptions options)
static void ThrowJsonException_DeserializeUnableToConvertValue(Type propertyType)
static void ThrowJsonException_MetadataPreservedArrayInvalidProperty(ref ReadStack state, Type propertyType, in Utf8JsonReader reader)