Skip to content

Commit 6c666e2

Browse files
committed
release: Improve JsonSerializer.
1 parent 70fe9d1 commit 6c666e2

File tree

6 files changed

+34
-58
lines changed

6 files changed

+34
-58
lines changed

src/Flarial.Runtime/Core/FlarialClient.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ protected FlarialClient() { }
2424

2525
public static FlarialClient Current { get; } = new FlarialClientRelease();
2626

27-
static readonly JsonSerializer<Dictionary<string, string>> s_serializer = JsonSerializer<Dictionary<string, string>>.Get();
28-
2927
protected abstract string Build { get; }
3028
protected abstract string FileName { get; }
3129
protected abstract string DownloadUri { get; }
@@ -57,7 +55,8 @@ public bool Launch(bool initialized)
5755
async Task<string> GetRemoteHashAsync()
5856
{
5957
using var stream = await HttpStack.GetStreamAsync(HashesUrl);
60-
return (await s_serializer.DeserializeAsync(stream))[Build];
58+
var json = await JsonSerializer.DeserializeAsync<Dictionary<string,string>>(stream);
59+
return json[Build];
6160
}
6261

6362
async Task<string> GetLocalHashAsync() => await Task.Run(() =>

src/Flarial.Runtime/Core/FlarialLauncher.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,12 @@ static FlarialLauncher()
3939
const string LauncherDownloadUri = "https://cdn.flarial.xyz/launcher/Flarial.Launcher.exe";
4040
const string Arguments = "/e:on /f:off /v:off /d /c call \"{0}\" & \"{1}\" /c start \"\" \"{2}\"";
4141

42-
static readonly string s_filename, s_arguments, s_version, s_source, s_script, s_content;
43-
static readonly JsonSerializer<Dictionary<string, string>> s_serializer = JsonSerializer<Dictionary<string, string>>.Get();
42+
static readonly string s_source;
43+
static readonly string s_script;
44+
static readonly string s_content;
45+
static readonly string s_version;
46+
static readonly string s_filename;
47+
static readonly string s_arguments;
4448

4549
public static async Task<bool> VerifyConnectionAsync()
4650
{
@@ -55,7 +59,8 @@ public static async Task<bool> VerifyConnectionAsync()
5559
public static async Task<bool> CheckForUpdatesAsync()
5660
{
5761
using var stream = await HttpStack.GetStreamAsync(LauncherVersionUri);
58-
return s_version != (await s_serializer.DeserializeAsync(stream))["version"];
62+
var json = await JsonSerializer.DeserializeAsync<Dictionary<string, string>>(stream);
63+
return s_version != json["version"];
5964
}
6065

6166
public static async Task DownloadAsync(Action<int> callback)
Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections;
3+
using System.Collections.Concurrent;
34
using System.Collections.Generic;
45
using System.IO;
56
using System.Runtime.Serialization;
@@ -8,45 +9,20 @@
89

910
namespace Flarial.Runtime.Services;
1011

11-
sealed class JsonSerializer<T>
12+
static class JsonSerializer
1213
{
13-
JsonSerializer() { }
14+
static readonly DataContractJsonSerializerSettings s_settings;
15+
static readonly ConcurrentDictionary<Type, DataContractJsonSerializer> s_serializers;
1416

1517
static JsonSerializer()
1618
{
1719
s_serializers = [];
18-
s_lock = ((ICollection)s_serializers).SyncRoot;
19-
s_settings = new()
20-
{
21-
UseSimpleDictionaryFormat = true,
22-
MaxItemsInObjectGraph = int.MaxValue,
23-
EmitTypeInformation = EmitTypeInformation.Never
24-
};
20+
s_settings = new() { UseSimpleDictionaryFormat = true, MaxItemsInObjectGraph = int.MaxValue, EmitTypeInformation = EmitTypeInformation.Never };
2521
}
2622

27-
static readonly object s_lock;
28-
static readonly Dictionary<Type, JsonSerializer<T>> s_serializers;
29-
static readonly DataContractJsonSerializerSettings s_settings = new();
23+
static DataContractJsonSerializer Get<T>() => s_serializers.GetOrAdd(typeof(T), static _ => new(_, s_settings));
3024

31-
readonly DataContractJsonSerializer _serializer = new(typeof(T), s_settings);
25+
internal static T Deserialize<T>(Stream stream) => (T)Get<T>().ReadObject(stream);
3226

33-
internal T Deserialize(Stream stream) => (T)_serializer.ReadObject(stream);
34-
35-
internal async Task<T> DeserializeAsync(Stream stream) => await Task.Run(() => Deserialize(stream));
36-
37-
internal static JsonSerializer<T> Get()
38-
{
39-
lock (s_lock)
40-
{
41-
var type = typeof(T);
42-
43-
if (!s_serializers.TryGetValue(type, out var serializer))
44-
{
45-
serializer = new();
46-
s_serializers.Add(type, serializer);
47-
}
48-
49-
return serializer;
50-
}
51-
}
27+
internal static async Task<T> DeserializeAsync<T>(Stream stream) => await Task.Run(() => Deserialize<T>(stream));
5228
}

src/Flarial.Runtime/Services/PromotionManager.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1+
using System;
12
using System.Runtime.Serialization;
23
using System.Threading.Tasks;
34

45
namespace Flarial.Runtime.Services;
56

67
public static class PromotionManager
78
{
8-
const string PromotionUri = "https://cdn.flarial.xyz/launcher/Promotions.json";
9-
10-
static readonly JsonSerializer<Promotion[]> s_serializer = JsonSerializer<Promotion[]>.Get();
9+
const string PromotionsUri = "https://cdn.flarial.xyz/launcher/Promotions.json";
1110

1211
public static async Task<Promotion[]> GetDetailsAsync()
1312
{
1413
try
1514
{
16-
using var stream = await HttpStack.GetStreamAsync(PromotionUri);
17-
return await s_serializer.DeserializeAsync(stream);
15+
using var stream = await HttpStack.GetStreamAsync(PromotionsUri);
16+
return await JsonSerializer.DeserializeAsync<Promotion[]>(stream);
1817
}
1918
catch { return []; }
2019
}

src/Flarial.Runtime/Versions/GDKVersionItem.cs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@ sealed class GDKVersionItem : VersionItem
1919
const string GameLaunchHelperUri = "https://cdn.flarial.xyz/launcher/gamelaunchhelper.dll";
2020
const string MSIXVCPackagesUri = "https://cdn.jsdelivr.net/gh/MinecraftBedrockArchiver/GdkLinks@latest/urls.json";
2121

22-
static readonly JsonSerializer<Dictionary<string, Dictionary<string, string[]>>> s_serializer;
23-
static GDKVersionItem() => s_serializer = JsonSerializer<Dictionary<string, Dictionary<string, string[]>>>.Get();
24-
2522
readonly string[] _downloadUris;
2623
readonly byte[] _gameLaunchHelper;
2724

@@ -31,27 +28,26 @@ sealed class GDKVersionItem : VersionItem
3128
_gameLaunchHelper = gameLaunchHelper;
3229
}
3330

34-
internal static async Task QueryAsync(SortedDictionary<string, VersionRegistry.VersionEntry> versionRegistry) => await Task.Run(async () =>
31+
internal static async Task QueryAsync(SortedDictionary<string, VersionRegistry.VersionEntry> registry)
3532
{
3633
var msixvcPackagesTask = HttpStack.GetStreamAsync(MSIXVCPackagesUri);
3734
var gameLaunchHelperTask = HttpStack.GetBytesAsync(GameLaunchHelperUri);
35+
3836
await Task.WhenAll(msixvcPackagesTask, gameLaunchHelperTask);
39-
4037
var gameLaunchHelper = await gameLaunchHelperTask;
41-
using var msixvcPackages = await msixvcPackagesTask;
38+
39+
using var stream = await msixvcPackagesTask;
40+
var json = await JsonSerializer.DeserializeAsync<Dictionary<string, Dictionary<string, string[]>>>(stream);
4241

43-
foreach (var item in s_serializer.Deserialize(msixvcPackages)["release"])
42+
foreach (var item in json["release"])
4443
{
4544
var index = item.Key.LastIndexOf('.');
4645
var key = item.Key.Substring(0, index);
4746

48-
lock (((ICollection)versionRegistry).SyncRoot)
49-
{
50-
if (!versionRegistry.TryGetValue(key, out var entry)) continue;
51-
entry._item = new GDKVersionItem(key, item.Value, gameLaunchHelper);
52-
}
47+
if (!registry.TryGetValue(key, out var entry)) continue;
48+
entry._item = new GDKVersionItem(key, item.Value, gameLaunchHelper);
5349
}
54-
});
50+
}
5551

5652
static async Task<string?> PingAsync(string uri, CancellationToken token)
5753
{

src/Flarial.Runtime/Versions/VersionRegistry.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ internal sealed class VersionEntry
1818
}
1919

2020
static readonly VersionItemComparer s_comparer = new();
21-
static readonly JsonSerializer<Dictionary<string, bool>> s_serializer = JsonSerializer<Dictionary<string, bool>>.Get();
2221

2322
const string SupportedVersionsUri = "https://cdn.flarial.xyz/launcher/Supported.json";
2423

@@ -44,9 +43,11 @@ internal sealed class VersionEntry
4443
public static async Task<VersionRegistry> CreateAsync() => await Task.Run(static async () =>
4544
{
4645
SortedDictionary<string, VersionEntry> registry = new(s_comparer);
46+
4747
using var stream = await HttpStack.GetStreamAsync(SupportedVersionsUri);
48+
var json = await JsonSerializer.DeserializeAsync<Dictionary<string, bool>>(stream);
4849

49-
foreach (var item in s_serializer.Deserialize(stream))
50+
foreach (var item in json)
5051
registry.Add(item.Key, new(item.Value));
5152

5253
await GDKVersionItem.QueryAsync(registry);

0 commit comments

Comments
 (0)