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

Commit 43d3882

Browse files
committed
Refresh JSON/JSV Type caches after assigning callback fns
1 parent fb09118 commit 43d3882

File tree

7 files changed

+72
-24
lines changed

7 files changed

+72
-24
lines changed

src/ServiceStack.Text/JsConfig.cs

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -861,7 +861,7 @@ public static Func<T, string> RawSerializeFn
861861
public static Func<T, T> OnSerializingFn
862862
{
863863
get { return onSerializingFn; }
864-
set { onSerializingFn = value; }
864+
set { onSerializingFn = value; Refresh(); }
865865
}
866866

867867
/// <summary>
@@ -871,18 +871,28 @@ public static Func<T, T> OnSerializingFn
871871
public static Action<T> OnSerializedFn
872872
{
873873
get { return onSerializedFn; }
874-
set { onSerializedFn = value; }
874+
set { onSerializedFn = value; Refresh(); }
875875
}
876876

877877
/// <summary>
878878
/// Define custom deserialization fn for BCL Structs
879879
/// </summary>
880-
public static Func<string, T> DeSerializeFn;
880+
private static Func<string, T> deSerializeFn;
881+
public static Func<string, T> DeSerializeFn
882+
{
883+
get { return deSerializeFn; }
884+
set { deSerializeFn = value; Refresh(); }
885+
}
881886

882887
/// <summary>
883888
/// Define custom raw deserialization fn for objects
884889
/// </summary>
885-
public static Func<string, T> RawDeserializeFn;
890+
private static Func<string, T> rawDeserializeFn;
891+
public static Func<string, T> RawDeserializeFn
892+
{
893+
get { return rawDeserializeFn; }
894+
set { rawDeserializeFn = value; Refresh(); }
895+
}
886896

887897
public static bool HasDeserializeFn
888898
{
@@ -893,7 +903,7 @@ public static bool HasDeserializeFn
893903
public static Func<T, T> OnDeserializedFn
894904
{
895905
get { return onDeserializedFn; }
896-
set { onDeserializedFn = value; }
906+
set { onDeserializedFn = value; Refresh(); }
897907
}
898908

899909
public static bool HasDeserialingFn
@@ -905,7 +915,7 @@ public static bool HasDeserialingFn
905915
public static Func<T, string, object, object> OnDeserializingFn
906916
{
907917
get { return onDeserializingFn; }
908-
set { onDeserializingFn = value; }
918+
set { onDeserializingFn = value; Refresh(); }
909919
}
910920

911921
/// <summary>
@@ -987,8 +997,8 @@ internal static object ParseFn(ITypeSerializer serializer, string str)
987997

988998
internal static void ClearFnCaches()
989999
{
990-
typeof(JsonWriter<>).MakeGenericType(new[] { typeof(T) }).InvokeReset();
991-
typeof(JsvWriter<>).MakeGenericType(new[] { typeof(T) }).InvokeReset();
1000+
JsonWriter<T>.Reset();
1001+
JsvWriter<T>.Reset();
9921002
}
9931003

9941004
public static void Reset()
@@ -998,6 +1008,14 @@ public static void Reset()
9981008
ExcludePropertyNames = null;
9991009
EmitCamelCaseNames = EmitLowercaseUnderscoreNames = IncludeTypeInfo = ExcludeTypeInfo = null;
10001010
}
1011+
1012+
public static void Refresh()
1013+
{
1014+
JsonReader<T>.Refresh();
1015+
JsonWriter<T>.Refresh();
1016+
JsvReader<T>.Refresh();
1017+
JsvWriter<T>.Refresh();
1018+
}
10011019
}
10021020

10031021
public enum PropertyConvention

src/ServiceStack.Text/Json/JsonReader.Generic.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,17 @@ internal static ParseStringDelegate GetParseFn(Type type)
4141

4242
public static class JsonReader<T>
4343
{
44-
private static readonly ParseStringDelegate ReadFn;
44+
private static ParseStringDelegate ReadFn;
4545

4646
static JsonReader()
4747
{
48-
ReadFn = JsonReader.Instance.GetParseFn<T>();
48+
Refresh();
4949
}
50+
51+
public static void Refresh()
52+
{
53+
ReadFn = JsonReader.Instance.GetParseFn<T>();
54+
}
5055

5156
public static ParseStringDelegate GetParseFn()
5257
{

src/ServiceStack.Text/Json/JsonWriter.Generic.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,17 @@ public static class JsonWriter<T>
149149
public static void Reset()
150150
{
151151
JsonWriter.RemoveCacheFn(typeof(T));
152-
153-
CacheFn = typeof(T) == typeof(object)
154-
? JsonWriter.WriteLateBoundObject
155-
: JsonWriter.Instance.GetWriteFn<T>();
152+
Refresh();
156153
}
157154

158-
public static WriteObjectDelegate WriteFn()
155+
public static void Refresh()
156+
{
157+
CacheFn = typeof (T) == typeof (object)
158+
? JsonWriter.WriteLateBoundObject
159+
: JsonWriter.Instance.GetWriteFn<T>();
160+
}
161+
162+
public static WriteObjectDelegate WriteFn()
159163
{
160164
return CacheFn ?? WriteObject;
161165
}

src/ServiceStack.Text/Jsv/JsvReader.Generic.cs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,17 @@ public static ParseStringDelegate GetParseFn(Type type)
4141

4242
internal static class JsvReader<T>
4343
{
44-
private static readonly ParseStringDelegate ReadFn;
44+
private static ParseStringDelegate ReadFn;
4545

4646
static JsvReader()
47-
{
48-
ReadFn = JsvReader.Instance.GetParseFn<T>();
49-
}
47+
{
48+
Refresh();
49+
}
50+
51+
public static void Refresh()
52+
{
53+
ReadFn = JsvReader.Instance.GetParseFn<T>();
54+
}
5055

5156
public static ParseStringDelegate GetParseFn()
5257
{

src/ServiceStack.Text/Jsv/JsvWriter.Generic.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,17 @@ public static class JsvWriter<T>
107107
public static void Reset()
108108
{
109109
JsvWriter.RemoveCacheFn(typeof(T));
110-
111-
CacheFn = typeof(T) == typeof(object)
112-
? JsvWriter.WriteLateBoundObject
113-
: JsvWriter.Instance.GetWriteFn<T>();
110+
Refresh();
114111
}
115112

116-
public static WriteObjectDelegate WriteFn()
113+
public static void Refresh()
114+
{
115+
CacheFn = typeof (T) == typeof (object)
116+
? JsvWriter.WriteLateBoundObject
117+
: JsvWriter.Instance.GetWriteFn<T>();
118+
}
119+
120+
public static WriteObjectDelegate WriteFn()
117121
{
118122
return CacheFn ?? WriteObject;
119123
}

tests/ServiceStack.Text.Tests/LicensingTests.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,5 +200,16 @@ public void Test_dynamically_loaded_assemblies()
200200

201201
Assert.That(assembly.ManifestModule.Name, Is.EqualTo("<Unknown>"));
202202
}
203+
204+
[Test]
205+
public void Doesnt_override_DateTime_config()
206+
{
207+
var fixedDate = new DateTime(2000, 01, 01);
208+
JsConfig<DateTime>.DeSerializeFn = s => fixedDate;
209+
210+
var result = "2020-01-01".FromJson<DateTime>();
211+
212+
Assert.That(result, Is.EqualTo(fixedDate));
213+
}
203214
}
204215
}

tests/ServiceStack.Text.Tests/StructTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ public void Test_structs_with_double_quotes()
9494

9595
JsConfig<Text>.SerializeFn = text => text.ToString();
9696
JsConfig<Text>.DeSerializeFn = v => new Text(v);
97+
JsConfig<Foo>.Refresh();
9798

9899
var json = JsonSerializer.SerializeToString(dto, dto.GetType());
99100
Assert.That(json, Is.EqualTo("{\"Name\":\"My \\\"quoted\\\" name\",\"Content1\":\"My \\\"quoted\\\" content\"}"));

0 commit comments

Comments
 (0)