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

Commit df49400

Browse files
committed
Merge pull request #467 from shift-evgeny/EM_fixes
Fix JsConfig<T> to run T's static constructor first
2 parents 57a26a9 + e11c78a commit df49400

File tree

5 files changed

+51
-19
lines changed

5 files changed

+51
-19
lines changed

src/ServiceStack.Text/JsConfig.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections.Generic;
44
using System.IO;
55
using System.Reflection;
6+
using System.Runtime.CompilerServices;
67
using System.Threading;
78
using ServiceStack.Text.Common;
89
using ServiceStack.Text.Json;
@@ -815,6 +816,12 @@ internal static void AddUniqueType(Type type)
815816

816817
public class JsConfig<T>
817818
{
819+
static JsConfig()
820+
{
821+
// Run the type's static constructor (which may set OnDeserialized, etc.) before we cache any information about it
822+
RuntimeHelpers.RunClassConstructor(typeof(T).TypeHandle);
823+
}
824+
818825
/// <summary>
819826
/// Always emit type info for this type. Takes precedence over ExcludeTypeInfo
820827
/// </summary>

tests/ServiceStack.Text.Tests/AdhocModelTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -780,20 +780,20 @@ public void Can_serialize_ICollection()
780780
[Test]
781781
public void Can_parse_different_3_part_date_formats()
782782
{
783-
Assert.That("28/06/2015".FromJsv<DateTime>().ToLongDateString(),
784-
Is.EqualTo("Sunday, June 28, 2015"));
783+
Assert.That("28/06/2015".FromJsv<DateTime>(),
784+
Is.EqualTo(new DateTime(2015, 6, 28)));
785785

786-
Assert.That("6/28/2015".FromJsv<DateTime>().ToLongDateString(),
787-
Is.EqualTo("Sunday, June 28, 2015"));
786+
Assert.That("6/28/2015".FromJsv<DateTime>(),
787+
Is.EqualTo(new DateTime(2015, 6, 28)));
788788

789789
DateTimeSerializer.OnParseErrorFn = (s, ex) =>
790790
{
791791
var parts = s.Split('/');
792792
return new DateTime(int.Parse(parts[2]), int.Parse(parts[0]), int.Parse(parts[1]));
793793
};
794794

795-
Assert.That("06/28/2015".FromJsv<DateTime>().ToLongDateString(),
796-
Is.EqualTo("Sunday, June 28, 2015"));
795+
Assert.That("06/28/2015".FromJsv<DateTime>(),
796+
Is.EqualTo(new DateTime(2015, 6, 28)));
797797

798798
DateTimeSerializer.OnParseErrorFn = null;
799799
}

tests/ServiceStack.Text.Tests/JsonTests/InheritAbstractTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ public void Can_serialize_class_with_list_that_classes_inherited_from_non_abstra
4848
// serialize to JSON using ServiceStack
4949
string jsonString = JsonSerializer.SerializeToString(blockBuster);
5050

51-
const string expected = "{\"Address\":\"Av. República do Líbano, 2175 - Indinópolis, São Paulo - SP, 04502-300\",\"Movies\":[{\"Title\":\"The Shawshank Redemption\",\"ImdbId\":\"tt0111161\",\"Rating\":9.2,\"Director\":\"Frank Darabont\",\"ReleaseDate\":\"\\/Date(792950400000-0000)\\/\",\"TagLine\":\"Fear can hold you prisoner. Hope can set you free.\",\"Genres\":[\"Crime\",\"Drama\"]},{\"__type\":\"ServiceStack.Text.Tests.JsonTests.MovieChild, ServiceStack.Text.Tests\",\"Oscar\":[\"Best Picture - 1972\",\"Best Actor - 1972\",\"Best Adapted Screenplay - 1972\"],\"Title\":\"The Godfather\",\"ImdbId\":\"tt0068646\",\"Rating\":9.2,\"Director\":\"Francis Ford Coppola\",\"ReleaseDate\":\"\\/Date(70214400000-0000)\\/\",\"TagLine\":\"An offer you can't refuse.\",\"Genres\":[\"Crime\",\"Drama\",\"Thriller\"]}]}";
51+
var expected = "{\"Address\":\"Av. República do Líbano, 2175 - Indinópolis, São Paulo - SP, 04502-300\",\"Movies\":[{\"Title\":\"The Shawshank Redemption\",\"ImdbId\":\"tt0111161\",\"Rating\":9.2,\"Director\":\"Frank Darabont\",\"ReleaseDate\":"
52+
+ JsonSerializer.SerializeToString(MoviesData.Movies[0].ReleaseDate) + ",\"TagLine\":\"Fear can hold you prisoner. Hope can set you free.\",\"Genres\":[\"Crime\",\"Drama\"]},{\"__type\":\"ServiceStack.Text.Tests.JsonTests.MovieChild, ServiceStack.Text.Tests\",\"Oscar\":[\"Best Picture - 1972\",\"Best Actor - 1972\",\"Best Adapted Screenplay - 1972\"],\"Title\":\"The Godfather\",\"ImdbId\":\"tt0068646\",\"Rating\":9.2,\"Director\":\"Francis Ford Coppola\",\"ReleaseDate\":"
53+
+ JsonSerializer.SerializeToString(child.ReleaseDate) + ",\"TagLine\":\"An offer you can't refuse.\",\"Genres\":[\"Crime\",\"Drama\",\"Thriller\"]}]}";
5254

53-
Assert.That(jsonString, Is.EqualTo(expected).
54-
Or.EqualTo(expected.Replace("792997200000", "792950400000")
55-
.Replace("70261200000", "70214400000")));
55+
Assert.That(jsonString, Is.EqualTo(expected));
5656
}
5757
}
5858
}

tests/ServiceStack.Text.Tests/JsonTests/JsonDateTimeTests.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -523,12 +523,10 @@ public void Can_serialize_json_date_rfc1123_local()
523523
var dateTime = new DateTime(1994, 11, 24, 12, 34, 56, DateTimeKind.Local);
524524
var ssJson = JsonSerializer.SerializeToString(dateTime);
525525

526-
var offsetSpan = TimeZoneInfo.Local.GetUtcOffset(dateTime);
527-
var offset = offsetSpan.ToTimeOffsetString(":");
526+
var dateTimeUtc = dateTime.ToUniversalTime();
527+
var ssJsonUtc = JsonSerializer.SerializeToString(dateTimeUtc);
528528

529-
Assert.That(ssJson, Is.EqualTo(@"""Thu, 24 Nov 1994 04:34:56 GMT"""). //Convert to UTC on wire
530-
Or.EqualTo(@"""Thu, 24 Nov 1994 17:34:56 GMT""").
531-
Or.EqualTo(@"""Thu, 24 Nov 1994 20:34:56 GMT"""));
529+
Assert.That(ssJson, Is.EqualTo(ssJsonUtc)); //Convert to UTC on wire
532530
JsConfig.Reset();
533531
}
534532

@@ -540,9 +538,10 @@ public void Can_serialize_json_date_rfc1123_unspecified()
540538
var dateTime = new DateTime(1994, 11, 24, 12, 34, 56, DateTimeKind.Unspecified);
541539
var ssJson = JsonSerializer.SerializeToString(dateTime);
542540

543-
Assert.That(ssJson, Is.EqualTo(@"""Thu, 24 Nov 1994 04:34:56 GMT"""). //Convert to UTC on wire
544-
Or.EqualTo(@"""Thu, 24 Nov 1994 17:34:56 GMT""").
545-
Or.EqualTo(@"""Thu, 24 Nov 1994 20:34:56 GMT"""));
541+
var dateTimeUtc = dateTime.ToUniversalTime();
542+
var ssJsonUtc = JsonSerializer.SerializeToString(dateTimeUtc);
543+
544+
Assert.That(ssJson, Is.EqualTo(ssJsonUtc)); //Convert to UTC on wire
546545
JsConfig.Reset();
547546
}
548547

tests/ServiceStack.Text.Tests/SerializationHookTests.cs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,20 @@ public void JsonSerializer_Deserialize_hooks_on_sub_class()
100100
Assert.That(deserialized.OnDeserializedTouched, Is.True);
101101
}
102102

103-
private void AddSerializeHooksForType<T>()
103+
[Test]
104+
public void JsonSerializer_Deserialize_hooks_set_in_cctor()
105+
{
106+
// Deserialize without serializing first, so we don't call the static constructor of HookTestCctor, which sets its own OnDeserialized callback.
107+
108+
//var original = new HookTestContainer { Child = new HookTestCctor() };
109+
//var json = JsonSerializer.SerializeToString(original);
110+
const string json = "{\"Child\":{\"OnDeserializingTouched\":false,\"OnDeserializedTouched\":false,\"OnSerializingTouched\":true,\"OnSerializedTouched\":false}}";
111+
112+
var deserialized = JsonSerializer.DeserializeFromString<HookTestContainer>(json);
113+
Assert.That(deserialized.Child.OnDeserializedTouched, Is.True);
114+
}
115+
116+
internal static void AddSerializeHooksForType<T>()
104117
{
105118
Type type = typeof(T);
106119
System.Reflection.MethodInfo[] typeMethods = type.GetMethods(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
@@ -192,5 +205,18 @@ protected void OnSerialized(StreamingContext ctx)
192205
public class HookTestSubClass : HookTestClass
193206
{
194207
}
208+
209+
public class HookTestCctor : HookTestClass
210+
{
211+
static HookTestCctor()
212+
{
213+
AddSerializeHooksForType<HookTestCctor>();
214+
}
215+
}
216+
217+
public class HookTestContainer
218+
{
219+
public HookTestCctor Child { get; set; }
220+
}
195221
}
196222
}

0 commit comments

Comments
 (0)