Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit d7829b0

Browse files
committed
Cache config if used more than once
1 parent c618923 commit d7829b0

File tree

8 files changed

+61
-42
lines changed

8 files changed

+61
-42
lines changed

src/ServiceStack.Text/Common/DateTimeSerializer.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,8 @@ private static string RepairXsdTimeSeparator(string dateTimeStr)
225225

226226
public static DateTime? ParseManual(string dateTimeStr)
227227
{
228-
var dateKind = JsConfig.AssumeUtc || JsConfig.AlwaysUseUtc
228+
var config = JsConfig.GetConfig();
229+
var dateKind = config.AssumeUtc || config.AlwaysUseUtc
229230
? DateTimeKind.Utc
230231
: DateTimeKind.Local;
231232

@@ -442,21 +443,23 @@ public static TimeSpan ParseXsdTimeSpan(string dateTimeStr)
442443

443444
public static string ToShortestXsdDateTimeString(DateTime dateTime)
444445
{
446+
var config = JsConfig.GetConfig();
447+
445448
dateTime = dateTime.UseConfigSpecifiedSetting();
446-
if (!string.IsNullOrEmpty(JsConfig.DateTimeFormat))
449+
if (!string.IsNullOrEmpty(config.DateTimeFormat))
447450
{
448-
return dateTime.ToString(JsConfig.DateTimeFormat, CultureInfo.InvariantCulture);
451+
return dateTime.ToString(config.DateTimeFormat, CultureInfo.InvariantCulture);
449452
}
450453

451454
var timeOfDay = dateTime.TimeOfDay;
452455
var isStartOfDay = timeOfDay.Ticks == 0;
453-
if (isStartOfDay && !JsConfig.SkipDateTimeConversion)
456+
if (isStartOfDay && !config.SkipDateTimeConversion)
454457
return dateTime.ToString(ShortDateTimeFormat, CultureInfo.InvariantCulture);
455458

456459
var hasFractionalSecs = (timeOfDay.Milliseconds != 0)
457460
|| (timeOfDay.Ticks % TimeSpan.TicksPerMillisecond != 0);
458461

459-
if (JsConfig.SkipDateTimeConversion)
462+
if (config.SkipDateTimeConversion)
460463
{
461464
if (!hasFractionalSecs)
462465
return dateTime.Kind == DateTimeKind.Local

src/ServiceStack.Text/Common/DeserializeDictionary.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -232,10 +232,12 @@ public static IDictionary<TKey, TValue> ParseDictionary<TKey, TValue>(
232232
{
233233
if (value.IsEmpty) return null;
234234

235+
var config = JsConfig.GetConfig();
236+
235237
var tryToParseItemsAsDictionaries =
236-
JsConfig.ConvertObjectTypesIntoStringDictionary && typeof(TValue) == typeof(object);
238+
config.ConvertObjectTypesIntoStringDictionary && typeof(TValue) == typeof(object);
237239
var tryToParseItemsAsPrimitiveTypes =
238-
JsConfig.TryToParsePrimitiveTypeValues && typeof(TValue) == typeof(object);
240+
config.TryToParsePrimitiveTypeValues && typeof(TValue) == typeof(object);
239241

240242
var index = VerifyAndGetStartIndex(value, createMapType);
241243

src/ServiceStack.Text/Common/DeserializeType.cs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ public static object ObjectStringToType(ReadOnlySpan<char> strType)
6969
return propertyValue;
7070
}
7171

72-
if (JsConfig.ConvertObjectTypesIntoStringDictionary && !strType.IsNullOrEmpty())
72+
var config = JsConfig.GetConfig();
73+
74+
if (config.ConvertObjectTypesIntoStringDictionary && !strType.IsNullOrEmpty())
7375
{
7476
if (strType[0] == JsWriter.MapStartChar)
7577
{
@@ -86,7 +88,7 @@ public static object ObjectStringToType(ReadOnlySpan<char> strType)
8688
}
8789
}
8890

89-
var primitiveType = JsConfig.TryToParsePrimitiveTypeValues ? ParsePrimitive(strType) : null;
91+
var primitiveType = config.TryToParsePrimitiveTypeValues ? ParsePrimitive(strType) : null;
9092
if (primitiveType != null)
9193
return primitiveType;
9294

@@ -156,7 +158,8 @@ public static object ParseAbstractType<T>(ReadOnlySpan<char> value)
156158

157159
public static object ParseQuotedPrimitive(string value)
158160
{
159-
var fn = JsConfig.ParsePrimitiveFn;
161+
var config = JsConfig.GetConfig();
162+
var fn = config.ParsePrimitiveFn;
160163
var result = fn?.Invoke(value);
161164
if (result != null)
162165
return result;
@@ -184,7 +187,7 @@ public static object ParseQuotedPrimitive(string value)
184187
}
185188
}
186189

187-
if (JsConfig.DateHandler == DateHandler.RFC1123)
190+
if (config.DateHandler == DateHandler.RFC1123)
188191
{
189192
// check that we have RFC1123 date:
190193
// ddd, dd MMM yyyy HH:mm:ss GMT
@@ -407,15 +410,17 @@ public static object ParseNumber(this ReadOnlySpan<char> value, bool bestFit)
407410
}
408411
}
409412

413+
var config = JsConfig.GetConfig();
414+
410415
// Parse as decimal
411-
var acceptDecimal = JsConfig.ParsePrimitiveFloatingPointTypes.Has(ParseAsType.Decimal);
416+
var acceptDecimal = config.ParsePrimitiveFloatingPointTypes.Has(ParseAsType.Decimal);
412417
var isDecimal = value.TryParseDecimal(out decimal decimalValue);
413418

414419
// Check if the number is an Primitive Integer type given that we have a decimal
415420
if (isDecimal && decimalValue == decimal.Truncate(decimalValue))
416421
{
417422
// Value is a whole number
418-
var parseAs = JsConfig.ParsePrimitiveIntegerTypes;
423+
var parseAs = config.ParsePrimitiveIntegerTypes;
419424
if (parseAs.Has(ParseAsType.Byte) && decimalValue <= byte.MaxValue && decimalValue >= byte.MinValue)
420425
return (byte)decimalValue;
421426
if (parseAs.Has(ParseAsType.SByte) && decimalValue <= sbyte.MaxValue && decimalValue >= sbyte.MinValue)
@@ -441,12 +446,12 @@ public static object ParseNumber(this ReadOnlySpan<char> value, bool bestFit)
441446
if (isDecimal && acceptDecimal)
442447
return decimalValue;
443448

444-
var acceptFloat = JsConfig.ParsePrimitiveFloatingPointTypes.HasFlag(ParseAsType.Single);
449+
var acceptFloat = config.ParsePrimitiveFloatingPointTypes.HasFlag(ParseAsType.Single);
445450
var isFloat = value.TryParseFloat(out float floatValue);
446451
if (acceptFloat && isFloat)
447452
return floatValue;
448453

449-
var acceptDouble = JsConfig.ParsePrimitiveFloatingPointTypes.HasFlag(ParseAsType.Double);
454+
var acceptDouble = config.ParsePrimitiveFloatingPointTypes.HasFlag(ParseAsType.Double);
450455
var isDouble = value.TryParseDouble(out double doubleValue);
451456
if (acceptDouble && isDouble)
452457
return doubleValue;

src/ServiceStack.Text/Common/DeserializeTypeRefJson.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ internal static object StringToType(ReadOnlySpan<char> strType,
3333
if (JsonTypeSerializer.IsEmptyMap(strType, index))
3434
return ctorFn();
3535

36+
var config = JsConfig.GetConfig();
37+
3638
object instance = null;
37-
var lenient = JsConfig.PropertyConvention == PropertyConvention.Lenient;
39+
var lenient = config.PropertyConvention == PropertyConvention.Lenient;
3840

3941
for (; index < strTypeLength; index++) { if (!JsonUtils.IsWhiteSpace(buffer[index])) break; } //Whitespace inline
4042

@@ -54,7 +56,7 @@ internal static object StringToType(ReadOnlySpan<char> strType,
5456
if (instance == null && possibleTypeInfo && propertyName.Equals(typeAttr.Span, StringComparison.OrdinalIgnoreCase))
5557
{
5658
var explicitTypeName = Serializer.ParseString(propertyValueStr);
57-
var explicitType = JsConfig.TypeFinder(explicitTypeName);
59+
var explicitType = config.TypeFinder(explicitTypeName);
5860

5961
if (explicitType == null || explicitType.IsInterface || explicitType.IsAbstract)
6062
{
@@ -127,8 +129,8 @@ internal static object StringToType(ReadOnlySpan<char> strType,
127129
}
128130
catch (Exception e)
129131
{
130-
if (JsConfig.OnDeserializationError != null) JsConfig.OnDeserializationError(instance, propType, propertyName.ToString(), propertyValueStr.ToString(), e);
131-
if (JsConfig.ThrowOnError) throw DeserializeTypeRef.GetSerializationException(propertyName.ToString(), propertyValueStr.ToString(), propType, e);
132+
config.OnDeserializationError?.Invoke(instance, propType, propertyName.ToString(), propertyValueStr.ToString(), e);
133+
if (config.ThrowOnError) throw DeserializeTypeRef.GetSerializationException(propertyName.ToString(), propertyValueStr.ToString(), propType, e);
132134
else Tracer.Instance.WriteWarning("WARN: failed to set dynamic property {0} with: {1}", propertyName.ToString(), propertyValueStr.ToString());
133135
}
134136
}
@@ -145,8 +147,8 @@ internal static object StringToType(ReadOnlySpan<char> strType,
145147
catch (NotSupportedException) { throw; }
146148
catch (Exception e)
147149
{
148-
if (JsConfig.OnDeserializationError != null) JsConfig.OnDeserializationError(instance, propType ?? typeAccessor.PropertyType, propertyName.ToString(), propertyValueStr.ToString(), e);
149-
if (JsConfig.ThrowOnError) throw DeserializeTypeRef.GetSerializationException(propertyName.ToString(), propertyValueStr.ToString(), typeAccessor.PropertyType, e);
150+
config.OnDeserializationError?.Invoke(instance, propType ?? typeAccessor.PropertyType, propertyName.ToString(), propertyValueStr.ToString(), e);
151+
if (config.ThrowOnError) throw DeserializeTypeRef.GetSerializationException(propertyName.ToString(), propertyValueStr.ToString(), typeAccessor.PropertyType, e);
150152
else Tracer.Instance.WriteWarning("WARN: failed to set property {0} with: {1}", propertyName.ToString(), propertyValueStr.ToString());
151153
}
152154
}

src/ServiceStack.Text/Common/DeserializeTypeRefJsv.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@ internal static object StringToType(ReadOnlySpan<char> strType,
2929
if (JsonTypeSerializer.IsEmptyMap(strType))
3030
return ctorFn();
3131

32+
var config = JsConfig.GetConfig();
33+
3234
object instance = null;
33-
var lenient = JsConfig.PropertyConvention == PropertyConvention.Lenient;
35+
var lenient = config.PropertyConvention == PropertyConvention.Lenient;
3436

3537
var strTypeLength = strType.Length;
3638
while (index < strTypeLength)
@@ -46,7 +48,7 @@ internal static object StringToType(ReadOnlySpan<char> strType,
4648
if (possibleTypeInfo && propertyName.Equals(typeAttr.Span, StringComparison.OrdinalIgnoreCase))
4749
{
4850
var explicitTypeName = Serializer.ParseString(propertyValueStr);
49-
var explicitType = JsConfig.TypeFinder(explicitTypeName);
51+
var explicitType = config.TypeFinder(explicitTypeName);
5052

5153
if (explicitType == null || explicitType.IsInterface || explicitType.IsAbstract)
5254
{
@@ -112,8 +114,8 @@ internal static object StringToType(ReadOnlySpan<char> strType,
112114
}
113115
catch (Exception e)
114116
{
115-
if (JsConfig.OnDeserializationError != null) JsConfig.OnDeserializationError(instance, propType, propertyName.ToString(), propertyValueStr.ToString(), e);
116-
if (JsConfig.ThrowOnError) throw DeserializeTypeRef.GetSerializationException(propertyName.ToString(), propertyValueStr.ToString(), propType, e);
117+
config.OnDeserializationError?.Invoke(instance, propType, propertyName.ToString(), propertyValueStr.ToString(), e);
118+
if (config.ThrowOnError) throw DeserializeTypeRef.GetSerializationException(propertyName.ToString(), propertyValueStr.ToString(), propType, e);
117119
else Tracer.Instance.WriteWarning("WARN: failed to set dynamic property {0} with: {1}", propertyName.ToString(), propertyValueStr.ToString());
118120
}
119121
}
@@ -130,8 +132,8 @@ internal static object StringToType(ReadOnlySpan<char> strType,
130132
catch (NotSupportedException) { throw; }
131133
catch (Exception e)
132134
{
133-
if (JsConfig.OnDeserializationError != null) JsConfig.OnDeserializationError(instance, propType ?? typeAccessor.PropertyType, propertyName.ToString(), propertyValueStr.ToString(), e);
134-
if (JsConfig.ThrowOnError) throw DeserializeTypeRef.GetSerializationException(propertyName.ToString(), propertyValueStr.ToString(), propType, e);
135+
config.OnDeserializationError?.Invoke(instance, propType ?? typeAccessor.PropertyType, propertyName.ToString(), propertyValueStr.ToString(), e);
136+
if (config.ThrowOnError) throw DeserializeTypeRef.GetSerializationException(propertyName.ToString(), propertyValueStr.ToString(), propType, e);
135137
else Tracer.Instance.WriteWarning("WARN: failed to set property {0} with: {1}", propertyName.ToString(), propertyValueStr.ToString());
136138
}
137139
}

src/ServiceStack.Text/Common/WriteType.cs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,26 +73,27 @@ private static bool TryWriteSelfType(TextWriter writer)
7373
{
7474
if (ShouldSkipType()) return false;
7575

76-
Serializer.WriteRawString(writer, JsConfig.TypeAttr);
76+
var config = JsConfig.GetConfig();
77+
78+
Serializer.WriteRawString(writer, config.TypeAttr);
7779
writer.Write(JsWriter.MapKeySeperator);
78-
Serializer.WriteRawString(writer, JsConfig.TypeWriter(typeof(T)));
80+
Serializer.WriteRawString(writer, config.TypeWriter(typeof(T)));
7981
return true;
8082
}
8183

8284
private static bool TryWriteTypeInfo(TextWriter writer, object obj)
8385
{
8486
if (obj == null || ShouldSkipType()) return false;
8587

86-
Serializer.WriteRawString(writer, JsConfig.TypeAttr);
88+
var config = JsConfig.GetConfig();
89+
90+
Serializer.WriteRawString(writer, config.TypeAttr);
8791
writer.Write(JsWriter.MapKeySeperator);
88-
Serializer.WriteRawString(writer, JsConfig.TypeWriter(obj.GetType()));
92+
Serializer.WriteRawString(writer, config.TypeWriter(obj.GetType()));
8993
return true;
9094
}
9195

92-
public static WriteObjectDelegate Write
93-
{
94-
get { return CacheFn; }
95-
}
96+
public static WriteObjectDelegate Write => CacheFn;
9697

9798
private static WriteObjectDelegate GetWriteFn()
9899
{
@@ -489,7 +490,8 @@ public static void WriteComplexQueryStringProperties(string typeName, TextWriter
489490
for (var index = 0; index < len; index++)
490491
{
491492
var propertyWriter = PropertyWriters[index];
492-
if (propertyWriter.shouldSerialize != null && !propertyWriter.shouldSerialize(typedInstance)) continue;
493+
if (propertyWriter.shouldSerialize != null && !propertyWriter.shouldSerialize(typedInstance))
494+
continue;
493495

494496
var propertyValue = instance != null ? propertyWriter.GetterFn(typedInstance) : null;
495497
if (propertyWriter.propertySuppressDefaultAttribute && Equals(propertyWriter.DefaultValue, propertyValue))
@@ -500,8 +502,8 @@ public static void WriteComplexQueryStringProperties(string typeName, TextWriter
500502
&& !Serializer.IncludeNullValues)
501503
continue;
502504

503-
if (JsConfig.ExcludePropertyReferences != null
504-
&& JsConfig.ExcludePropertyReferences.Contains(propertyWriter.propertyReferenceName)) continue;
505+
if (config.ExcludePropertyReferences != null && config.ExcludePropertyReferences.Contains(propertyWriter.propertyReferenceName))
506+
continue;
505507

506508
if (i++ > 0)
507509
writer.Write('&');

src/ServiceStack.Text/Json/JsonUtils.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,9 @@ public static void WriteString(TextWriter writer, string value)
5353
return;
5454
}
5555

56-
var escapeHtmlChars = JsConfig.EscapeHtmlChars;
57-
var escapeUnicode = JsConfig.EscapeUnicode;
56+
var config = JsConfig.GetConfig();
57+
var escapeHtmlChars = config.EscapeHtmlChars;
58+
var escapeUnicode = config.EscapeUnicode;
5859

5960
if (!HasAnyEscapeChars(value, escapeHtmlChars))
6061
{

src/ServiceStack.Text/ReflectionExtensions.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,9 @@ public static FieldInfo[] GetSerializableFields(this Type type)
644644
f.HasAttribute<DataMemberAttribute>()).ToArray();
645645
}
646646

647-
if (!JsConfig.IncludePublicFields)
647+
var config = JsConfig.GetConfig();
648+
649+
if (!config.IncludePublicFields)
648650
return TypeConstants.EmptyFieldInfoArray;
649651

650652
var publicFields = type.GetPublicFields();
@@ -653,7 +655,7 @@ public static FieldInfo[] GetSerializableFields(this Type type)
653655
return publicFields
654656
.Where(prop => prop.AllAttributes()
655657
.All(attr => !IgnoreAttributesNamed.Contains(attr.GetType().Name)))
656-
.Where(prop => !JsConfig.ExcludeTypes.Contains(prop.FieldType))
658+
.Where(prop => !config.ExcludeTypes.Contains(prop.FieldType))
657659
.ToArray();
658660
}
659661

0 commit comments

Comments
 (0)