Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
JsonConverter.cs
Go to the documentation of this file.
5
7
8public abstract class JsonConverter
9{
11
12 internal abstract ConverterStrategy ConverterStrategy { get; }
13
14 internal bool CanUseDirectReadOrWrite { get; set; }
15
16 internal virtual bool CanHaveIdMetadata => false;
17
18 internal bool CanBePolymorphic { get; set; }
19
20 internal abstract Type? ElementType { get; }
21
22 internal abstract Type? KeyType { get; }
23
24 internal bool IsValueType { get; set; }
25
26 internal bool IsInternalConverter { get; set; }
27
28 internal virtual Type RuntimeType => TypeToConvert;
29
30 internal abstract Type TypeToConvert { get; }
31
32 internal virtual bool ConstructorIsParameterized { get; }
33
34 internal ConstructorInfo? ConstructorInfo { get; set; }
35
36 internal virtual bool RequiresDynamicMemberAccessors { get; }
37
38 internal JsonConverter()
39 {
40 }
41
42 public abstract bool CanConvert(Type typeToConvert);
43
48
53
55
57
59
61 {
62 if (state.FlushThreshold > 0)
63 {
64 return writer.BytesPending > state.FlushThreshold;
65 }
66 return false;
67 }
68
70
72
74
76
78 {
79 }
80
84
85 [MethodImpl(MethodImplOptions.AggressiveInlining)]
87 {
88 if (!state.ReadAhead || converterStrategy != ConverterStrategy.Value)
89 {
90 return reader.Read();
91 }
93 }
94
96 {
97 JsonReaderState currentState = reader.CurrentState;
98 long bytesConsumed = reader.BytesConsumed;
99 if (!reader.Read())
100 {
101 return false;
102 }
103 JsonTokenType tokenType = reader.TokenType;
104 if (tokenType == JsonTokenType.StartObject || tokenType == JsonTokenType.StartArray)
105 {
106 bool flag = reader.TrySkip();
107 reader = new Utf8JsonReader(reader.OriginalSpan.Slice(checked((int)bytesConsumed)), reader.IsFinalBlock, currentState);
109 if (!flag)
110 {
111 return false;
112 }
113 reader.ReadWithVerify();
114 }
115 return true;
116 }
117}
118public abstract class JsonConverter<T> : JsonConverter
119{
121
122 internal override Type? KeyType => null;
123
124 internal override Type? ElementType => null;
125
126 public virtual bool HandleNull
127 {
128 get
129 {
131 HandleNullOnWrite = false;
132 return false;
133 }
134 }
135
136 internal bool HandleNullOnRead { get; private set; }
137
138 internal bool HandleNullOnWrite { get; private set; }
139
140 internal bool CanBeNull { get; }
141
142 internal sealed override Type TypeToConvert => typeof(T);
143
145 {
146 return ReadCore(ref reader, options, ref state);
147 }
148
150 {
151 try
152 {
153 if (!state.IsContinuation)
154 {
156 {
157 if (state.SupportContinuation)
158 {
159 state.BytesConsumed += reader.BytesConsumed;
160 if (state.Current.ReturnValue == null)
161 {
162 return default(T);
163 }
164 return (T)state.Current.ReturnValue;
165 }
166 state.BytesConsumed += reader.BytesConsumed;
167 return default(T);
168 }
169 }
171 {
172 state.BytesConsumed += reader.BytesConsumed;
173 return default(T);
174 }
175 JsonPropertyInfo propertyInfoForTypeInfo = state.Current.JsonTypeInfo.PropertyInfoForTypeInfo;
176 if (TryRead(ref reader, propertyInfoForTypeInfo.RuntimePropertyType, options, ref state, out var value) && !reader.Read() && !reader.IsFinalBlock)
177 {
179 }
180 state.BytesConsumed += reader.BytesConsumed;
181 return value;
182 }
183 catch (JsonReaderException ex)
184 {
186 return default(T);
187 }
188 catch (FormatException ex2) when (ex2.Source == "System.Text.Json.Rethrowable")
189 {
191 return default(T);
192 }
193 catch (InvalidOperationException ex3) when (ex3.Source == "System.Text.Json.Rethrowable")
194 {
196 return default(T);
197 }
198 catch (JsonException ex4) when (ex4.Path == null)
199 {
201 throw;
202 }
204 {
205 if (ex5.Message.Contains(" Path: "))
206 {
207 throw;
208 }
210 return default(T);
211 }
212 }
213
215 {
216 if (base.IsValueType)
217 {
218 if (value == null && Nullable.GetUnderlyingType(TypeToConvert) == null)
219 {
221 }
222 if (options.ReferenceHandlingStrategy == ReferenceHandlingStrategy.IgnoreCycles && value != null)
223 {
224 state.ReferenceResolver.PushReferenceForCycleDetection(value);
225 }
226 }
227 T value2 = (T)value;
229 }
230
232 {
233 try
234 {
236 }
237 catch (InvalidOperationException ex) when (ex.Source == "System.Text.Json.Rethrowable")
238 {
240 throw;
241 }
242 catch (JsonException ex2) when (ex2.Path == null)
243 {
245 throw;
246 }
248 {
249 if (ex3.Message.Contains(" Path: "))
250 {
251 throw;
252 }
254 return false;
255 }
256 }
257
271
272 public override bool CanConvert(Type typeToConvert)
273 {
274 return typeToConvert == typeof(T);
275 }
276
277 internal sealed override JsonPropertyInfo CreateJsonPropertyInfo()
278 {
279 return new JsonPropertyInfo<T>();
280 }
281
283 {
284 return new JsonParameterInfo<T>();
285 }
286
288 {
289 T value2 = (T)value;
291 }
292
294 {
296 return true;
297 }
298
300 {
301 value = Read(ref reader, typeToConvert, options);
302 return true;
303 }
304
306
308 {
310 {
311 if (reader.TokenType == JsonTokenType.Null && !HandleNullOnRead)
312 {
313 if (!CanBeNull)
314 {
316 }
317 value = default(T);
318 return true;
319 }
320 if (base.IsInternalConverter)
321 {
322 if (state.Current.NumberHandling.HasValue && IsInternalConverterForNumberType)
323 {
324 value = ReadNumberWithCustomHandling(ref reader, state.Current.NumberHandling.Value, options);
325 }
326 else
327 {
328 value = Read(ref reader, typeToConvert, options);
329 }
330 }
331 else
332 {
333 JsonTokenType tokenType = reader.TokenType;
334 int currentDepth = reader.CurrentDepth;
335 long bytesConsumed = reader.BytesConsumed;
336 if (state.Current.NumberHandling.HasValue && IsInternalConverterForNumberType)
337 {
338 value = ReadNumberWithCustomHandling(ref reader, state.Current.NumberHandling.Value, options);
339 }
340 else
341 {
342 value = Read(ref reader, typeToConvert, options);
343 }
344 VerifyRead(tokenType, currentDepth, bytesConsumed, isValueConverter: true, ref reader);
345 }
346 if (options.ReferenceHandlingStrategy == ReferenceHandlingStrategy.Preserve && base.CanBePolymorphic)
347 {
348 T val = value;
350 {
352 }
353 }
354 return true;
355 }
356 bool isContinuation = state.IsContinuation;
357 state.Push();
358 bool flag;
359 if (base.IsInternalConverter)
360 {
361 if (reader.TokenType == JsonTokenType.Null && !HandleNullOnRead && !isContinuation)
362 {
363 if (!CanBeNull)
364 {
366 }
367 value = default(T);
368 flag = true;
369 }
370 else
371 {
372 flag = OnTryRead(ref reader, typeToConvert, options, ref state, out value);
373 }
374 }
375 else
376 {
377 if (!isContinuation)
378 {
379 if (reader.TokenType == JsonTokenType.Null && !HandleNullOnRead)
380 {
381 if (!CanBeNull)
382 {
384 }
385 value = default(T);
386 state.Pop(success: true);
387 return true;
388 }
389 state.Current.OriginalTokenType = reader.TokenType;
390 state.Current.OriginalDepth = reader.CurrentDepth;
391 }
392 flag = OnTryRead(ref reader, typeToConvert, options, ref state, out value);
393 if (flag)
394 {
395 if (state.IsContinuation)
396 {
398 }
399 VerifyRead(state.Current.OriginalTokenType, state.Current.OriginalDepth, 0L, isValueConverter: false, ref reader);
400 }
401 }
402 state.Pop(flag);
403 return flag;
404 }
405
407 {
408 T value2;
409 bool result = TryRead(ref reader, TypeToConvert, options, ref state, out value2);
410 value = value2;
411 return result;
412 }
413
414 private static bool IsNull(T value)
415 {
416 return value == null;
417 }
418
420 {
421 if (writer.CurrentDepth >= options.EffectiveMaxDepth)
422 {
424 }
425 if (default(T) == null && !HandleNullOnWrite && IsNull(value))
426 {
427 writer.WriteNullValue();
428 return true;
429 }
430 bool flag = false;
431 if (!typeof(T).IsValueType && value != null)
432 {
433 if (options.ReferenceHandlingStrategy == ReferenceHandlingStrategy.IgnoreCycles && ConverterStrategy != ConverterStrategy.Value)
434 {
435 ReferenceResolver referenceResolver = state.ReferenceResolver;
436 if (referenceResolver.ContainsReferenceForCycleDetection(value))
437 {
438 writer.WriteNullValue();
439 return true;
440 }
442 flag = true;
443 }
444 if (base.CanBePolymorphic)
445 {
447 if (type != TypeToConvert)
448 {
449 JsonConverter jsonConverter = state.Current.InitializeReEntry(type, options);
450 if (jsonConverter.IsValueType)
451 {
452 switch (options.ReferenceHandlingStrategy)
453 {
454 case ReferenceHandlingStrategy.Preserve:
455 if (jsonConverter.CanHaveIdMetadata && !state.IsContinuation && JsonSerializer.TryWriteReferenceForBoxedStruct(value, ref state, writer))
456 {
457 return true;
458 }
459 break;
460 case ReferenceHandlingStrategy.IgnoreCycles:
461 state.ReferenceResolver.PushReferenceForCycleDetection(value);
462 flag = true;
463 break;
464 }
465 }
466 bool result = jsonConverter.TryWriteAsObject(writer, value, options, ref state);
467 if (flag)
468 {
469 state.ReferenceResolver.PopReferenceForCycleDetection();
470 }
471 return result;
472 }
473 }
474 }
476 {
477 int currentDepth = writer.CurrentDepth;
478 if (state.Current.NumberHandling.HasValue && IsInternalConverterForNumberType)
479 {
480 WriteNumberWithCustomHandling(writer, value, state.Current.NumberHandling.Value);
481 }
482 else
483 {
485 }
487 if (!typeof(T).IsValueType && flag)
488 {
489 state.ReferenceResolver.PopReferenceForCycleDetection();
490 }
491 return true;
492 }
493 bool isContinuation = state.IsContinuation;
494 state.Push();
495 if (!isContinuation)
496 {
497 state.Current.OriginalDepth = writer.CurrentDepth;
498 }
500 if (flag2)
501 {
502 VerifyWrite(state.Current.OriginalDepth, writer);
503 }
504 state.Pop(flag2);
505 if (flag)
506 {
507 state.ReferenceResolver.PopReferenceForCycleDetection();
508 }
509 return flag2;
510 }
511
513 {
514 if (!base.IsInternalConverter)
515 {
517 }
519 if (jsonDictionaryConverter == null)
520 {
522 }
523 if (writer.CurrentDepth >= options.EffectiveMaxDepth)
524 {
526 }
527 bool isContinuation = state.IsContinuation;
528 state.Push();
529 if (!isContinuation)
530 {
531 state.Current.OriginalDepth = writer.CurrentDepth;
532 }
534 state.Current.DeclaredJsonPropertyInfo = state.Current.JsonTypeInfo.ElementTypeInfo.PropertyInfoForTypeInfo;
535 bool flag = jsonDictionaryConverter.OnWriteResume(writer, value, options, ref state);
536 if (flag)
537 {
538 VerifyWrite(state.Current.OriginalDepth, writer);
539 }
540 state.Pop(flag);
541 return flag;
542 }
543
544 internal void VerifyRead(JsonTokenType tokenType, int depth, long bytesConsumed, bool isValueConverter, ref Utf8JsonReader reader)
545 {
546 switch (tokenType)
547 {
548 case JsonTokenType.StartArray:
549 if (reader.TokenType != JsonTokenType.EndArray)
550 {
552 }
553 else if (depth != reader.CurrentDepth)
554 {
556 }
557 return;
558 case JsonTokenType.StartObject:
559 if (reader.TokenType != JsonTokenType.EndObject)
560 {
562 }
563 else if (depth != reader.CurrentDepth)
564 {
566 }
567 return;
568 }
569 if (!isValueConverter)
570 {
571 if (!HandleNullOnRead || tokenType != JsonTokenType.Null)
572 {
574 }
575 }
576 else if (reader.BytesConsumed != bytesConsumed)
577 {
579 }
580 }
581
583 {
584 if (originalDepth != writer.CurrentDepth)
585 {
587 }
588 }
589
591
593 {
594 if (!base.IsInternalConverter && options.TryGetDefaultSimpleConverter(TypeToConvert, out var converter))
595 {
596 return ((JsonConverter<T>)converter).ReadAsPropertyNameCore(ref reader, TypeToConvert, options);
597 }
599 return default(T);
600 }
601
603 {
604 long bytesConsumed = reader.BytesConsumed;
605 T result = ReadAsPropertyName(ref reader, typeToConvert, options);
606 if (reader.BytesConsumed != bytesConsumed)
607 {
609 }
610 return result;
611 }
612
614 {
615 if (!base.IsInternalConverter && options.TryGetDefaultSimpleConverter(TypeToConvert, out var converter))
616 {
617 ((JsonConverter<T>)converter).WriteAsPropertyNameCore(writer, value, options, isWritingExtensionDataProperty: false);
618 }
619 else
620 {
622 }
623 }
624
626 {
628 {
629 writer.WritePropertyName((string)(object)value);
630 return;
631 }
632 int currentDepth = writer.CurrentDepth;
634 if (currentDepth != writer.CurrentDepth || writer.TokenType != JsonTokenType.PropertyName)
635 {
637 }
638 }
639
644
649
654}
static string NodeJsonObjectCustomConverterNotAllowedOnExtensionProperty
Definition SR.cs:320
Definition SR.cs:7
static bool TryGetReferenceFromJsonElement(ref ReadStack state, JsonElement element, out object referenceValue)
static bool TryWriteReferenceForBoxedStruct(object currentValue, ref WriteStack state, Utf8JsonWriter writer)
virtual bool OnTryRead(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, ref ReadStack state, out T value)
bool TryWriteDataExtensionProperty(Utf8JsonWriter writer, T value, JsonSerializerOptions options, ref WriteStack state)
bool ShouldFlush(Utf8JsonWriter writer, ref WriteStack state)
void VerifyWrite(int originalDepth, Utf8JsonWriter writer)
virtual void CreateInstanceForReferenceResolver(ref Utf8JsonReader reader, ref ReadStack state, JsonSerializerOptions options)
static bool SingleValueReadWithReadAhead(ConverterStrategy converterStrategy, ref Utf8JsonReader reader, ref ReadStack state)
override bool TryWriteAsObject(Utf8JsonWriter writer, object value, JsonSerializerOptions options, ref WriteStack state)
virtual bool OnTryWrite(Utf8JsonWriter writer, T value, JsonSerializerOptions options, ref WriteStack state)
virtual T ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
bool TryWrite(Utf8JsonWriter writer, in T value, JsonSerializerOptions options, ref WriteStack state)
override JsonPropertyInfo CreateJsonPropertyInfo()
virtual T ReadAsPropertyNameCore(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
override object ReadCoreAsObject(ref Utf8JsonReader reader, JsonSerializerOptions options, ref ReadStack state)
bool TryRead(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, ref ReadStack state, out T value)
void VerifyRead(JsonTokenType tokenType, int depth, long bytesConsumed, bool isValueConverter, ref Utf8JsonReader reader)
override bool WriteCoreAsObject(Utf8JsonWriter writer, object value, JsonSerializerOptions options, ref WriteStack state)
void WriteAsPropertyNameCoreAsObject(Utf8JsonWriter writer, object value, JsonSerializerOptions options, bool isWritingExtensionDataProperty)
object ReadCoreAsObject(ref Utf8JsonReader reader, JsonSerializerOptions options, ref ReadStack state)
static bool DoSingleValueReadWithReadAhead(ref Utf8JsonReader reader, ref ReadStack state)
bool WriteCoreAsObject(Utf8JsonWriter writer, object value, JsonSerializerOptions options, ref WriteStack state)
T ReadCore(ref Utf8JsonReader reader, JsonSerializerOptions options, ref ReadStack state)
virtual void WriteAsPropertyNameCore(Utf8JsonWriter writer, T value, JsonSerializerOptions options, bool isWritingExtensionDataProperty)
bool TryWriteAsObject(Utf8JsonWriter writer, object value, JsonSerializerOptions options, ref WriteStack state)
bool TryReadAsObject(ref Utf8JsonReader reader, JsonSerializerOptions options, ref ReadStack state, out object value)
virtual void WriteAsPropertyName(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
override void WriteAsPropertyNameCoreAsObject(Utf8JsonWriter writer, object value, JsonSerializerOptions options, bool isWritingExtensionDataProperty)
virtual object CreateObject(JsonSerializerOptions options)
virtual void Initialize(JsonSerializerOptions options, JsonTypeInfo jsonTypeInfo=null)
virtual void WriteNumberWithCustomHandling(Utf8JsonWriter writer, T value, JsonNumberHandling handling)
override bool CanConvert(Type typeToConvert)
virtual void ReadElementAndSetProperty(object obj, string propertyName, ref Utf8JsonReader reader, JsonSerializerOptions options, ref ReadStack state)
override bool TryReadAsObject(ref Utf8JsonReader reader, JsonSerializerOptions options, ref ReadStack state, out object value)
override JsonParameterInfo CreateJsonParameterInfo()
virtual T ReadNumberWithCustomHandling(ref Utf8JsonReader reader, JsonNumberHandling handling, JsonSerializerOptions options)
bool WriteCore(Utf8JsonWriter writer, in T value, JsonSerializerOptions options, ref WriteStack state)
T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
virtual void PushReferenceForCycleDetection(object value)
static void ThrowJsonException_SerializerCycleDetected(int maxDepth)
static void ThrowJsonException_SerializationConverterRead(JsonConverter converter)
static void ThrowNotSupportedException(ref ReadStack state, in Utf8JsonReader reader, NotSupportedException ex)
static void ThrowJsonException_DeserializeUnableToConvertValue(Type propertyType)
static void ThrowNotSupportedException_DictionaryKeyTypeNotSupported(Type keyType, JsonConverter converter)
static void AddJsonExceptionInformation(ref ReadStack state, in Utf8JsonReader reader, JsonException ex)
static void ReThrowWithPath(ref ReadStack state, JsonReaderException ex)
static void ThrowJsonException_SerializationConverterWrite(JsonConverter converter)
bool IsValueType
Definition Type.cs:234
static ? Type GetType(string typeName, bool throwOnError, bool ignoreCase)
Definition Type.cs:408
static ? Type GetUnderlyingType(Type nullableType)
Definition Nullable.cs:139