Skip to content

Commit a5fe464

Browse files
committed
Abstract serialization
1 parent 44b1b24 commit a5fe464

11 files changed

+125
-128
lines changed

ChatGPT.Core/Defaults.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public static IServiceProvider ConfigureDefaultServices()
4242
{
4343
IServiceCollection serviceCollection = new ServiceCollection();
4444

45+
serviceCollection.AddSingleton<IChatSerializer, SystemTextJsonChatSerializer>();
4546
serviceCollection.AddSingleton<IStorageFactory, IsolatedStorageFactory>();
4647
serviceCollection.AddSingleton<IChatService, ChatService>();
4748

ChatGPT.UI.Browser/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ private static void ConfigureDefaultServices()
3838
serviceCollection.AddSingleton<IStorageFactory, BrowserStorageFactory>();
3939
serviceCollection.AddSingleton<IApplicationService, ApplicationService>();
4040
serviceCollection.AddSingleton<IPluginsService, PluginsService>();
41+
serviceCollection.AddSingleton<IChatSerializer, SystemTextJsonChatSerializer>();
4142
serviceCollection.AddSingleton<IChatService, ChatService>();
4243
serviceCollection.AddSingleton<ICompletionsService, CompletionsService>();
4344
serviceCollection.AddSingleton<MainViewModel>();

ChatGPT.UI/App.axaml.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public static void ConfigureDefaultServices()
3737
serviceCollection.AddSingleton<IStorageFactory, IsolatedStorageFactory>();
3838
serviceCollection.AddSingleton<IApplicationService, ApplicationService>();
3939
serviceCollection.AddSingleton<IPluginsService, PluginsService>();
40+
serviceCollection.AddSingleton<IChatSerializer, SystemTextJsonChatSerializer>();
4041
serviceCollection.AddSingleton<IChatService, ChatService>();
4142
serviceCollection.AddSingleton<ICompletionsService, CompletionsService>();
4243
serviceCollection.AddSingleton<MainViewModel>();
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace AI.Model.Services;
2+
3+
public interface IChatSerializer
4+
{
5+
string Serialize<T>(T value);
6+
T? Deserialize<T>(string json);
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace AI.Model.Services;
2+
3+
public interface ICompletionsSerializer
4+
{
5+
string Serialize<T>(T value);
6+
T? Deserialize<T>(string json);
7+
}

ChatGPT/Services/ChatService.cs

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
using System.Net;
33
using System.Net.Http;
44
using System.Text;
5-
using System.Text.Json;
6-
using System.Text.Json.Serialization;
75
using System.Threading;
86
using System.Threading.Tasks;
97
using AI.Model.Json.Chat;
@@ -13,23 +11,20 @@ namespace AI.Services;
1311

1412
public class ChatService : IChatService
1513
{
14+
private readonly IChatSerializer _serializer;
1615
private static readonly HttpClient s_client;
1716

18-
private static readonly ChatJsonContext s_serializerContext;
19-
2017
static ChatService()
2118
{
2219
s_client = new();
20+
}
2321

24-
s_serializerContext = new(
25-
new JsonSerializerOptions
26-
{
27-
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
28-
IgnoreReadOnlyProperties = true
29-
});
22+
public ChatService(IChatSerializer serializer)
23+
{
24+
_serializer = serializer;
3025
}
3126

32-
private static string GetRequestBodyJson(ChatServiceSettings settings)
27+
private string GetRequestBodyJson(ChatServiceSettings settings)
3328
{
3429
// Set up the request body
3530
var requestBody = new ChatRequestBody
@@ -48,10 +43,10 @@ private static string GetRequestBodyJson(ChatServiceSettings settings)
4843
};
4944

5045
// Serialize the request body to JSON using the JsonSerializer.
51-
return JsonSerializer.Serialize(requestBody, s_serializerContext.ChatRequestBody);
46+
return _serializer.Serialize(requestBody);
5247
}
5348

54-
private static async Task<ChatResponse?> SendApiRequestAsync(string apiUrl, string apiKey, string requestBodyJson, CancellationToken token)
49+
private async Task<ChatResponse?> SendApiRequestAsync(string apiUrl, string apiKey, string requestBodyJson, CancellationToken token)
5550
{
5651
// Create a new HttpClient for making the API request
5752

@@ -86,7 +81,7 @@ private static string GetRequestBodyJson(ChatServiceSettings settings)
8681
case HttpStatusCode.NotFound:
8782
case HttpStatusCode.BadRequest:
8883
{
89-
return JsonSerializer.Deserialize(responseBody, s_serializerContext.ChatResponseError);
84+
return _serializer.Deserialize<ChatResponseError>(responseBody);
9085
}
9186
}
9287

@@ -96,7 +91,7 @@ private static string GetRequestBodyJson(ChatServiceSettings settings)
9691
}
9792

9893
// Return the response data
99-
return JsonSerializer.Deserialize(responseBody, s_serializerContext.ChatResponseSuccess);
94+
return _serializer.Deserialize<ChatResponseSuccess>(responseBody);
10095
}
10196

10297
public async Task<ChatResponse?> GetResponseDataAsync(ChatServiceSettings settings, CancellationToken token)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System.Text.Json;
2+
using System.Text.Json.Serialization;
3+
using System.Text.Json.Serialization.Metadata;
4+
using AI.Model.Json.Chat;
5+
using AI.Model.Services;
6+
7+
namespace AI.Services;
8+
9+
public class SystemTextJsonChatSerializer : IChatSerializer
10+
{
11+
private static readonly ChatJsonContext s_serializerContext;
12+
13+
static SystemTextJsonChatSerializer()
14+
{
15+
s_serializerContext = new(
16+
new JsonSerializerOptions
17+
{
18+
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
19+
IgnoreReadOnlyProperties = true
20+
});
21+
}
22+
23+
public string Serialize<T>(T value)
24+
{
25+
var typeInfo = (JsonTypeInfo<T>)s_serializerContext.GetTypeInfo(typeof(T));
26+
return JsonSerializer.Serialize(value, typeInfo);
27+
}
28+
29+
public T? Deserialize<T>(string json)
30+
{
31+
var typeInfo = (JsonTypeInfo<T?>)s_serializerContext.GetTypeInfo(typeof(T));
32+
return JsonSerializer.Deserialize(json, typeInfo);
33+
}
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System.Text.Json;
2+
using System.Text.Json.Serialization;
3+
using System.Text.Json.Serialization.Metadata;
4+
using AI.Model.Json.Completions;
5+
using AI.Model.Services;
6+
7+
namespace AI.Services;
8+
9+
public class SystemTextJsonCompletionsSerializer : ICompletionsSerializer
10+
{
11+
private static readonly CompletionsJsonContext s_serializerContext;
12+
13+
static SystemTextJsonCompletionsSerializer()
14+
{
15+
s_serializerContext = new(
16+
new JsonSerializerOptions
17+
{
18+
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
19+
IgnoreReadOnlyProperties = true
20+
});
21+
}
22+
23+
public string Serialize<T>(T value)
24+
{
25+
var typeInfo = (JsonTypeInfo<T>)s_serializerContext.GetTypeInfo(typeof(T));
26+
return JsonSerializer.Serialize(value, typeInfo);
27+
}
28+
29+
public T? Deserialize<T>(string json)
30+
{
31+
var typeInfo = (JsonTypeInfo<T?>)s_serializerContext.GetTypeInfo(typeof(T));
32+
return JsonSerializer.Deserialize(json, typeInfo);
33+
}
34+
}

ChatGptCom/Chat.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Runtime.InteropServices;
22
using AI.Model.Services;
3+
using AI.Services;
34
using ChatGPT;
45
using ChatGPT.Model.Services;
56
using ChatGPT.Services;
@@ -48,6 +49,7 @@ static Chat()
4849
IServiceCollection serviceCollection = new ServiceCollection();
4950

5051
serviceCollection.AddSingleton<IStorageFactory, IsolatedStorageFactory>();
52+
serviceCollection.AddSingleton<IChatSerializer, NewtonsoftChatSerializer>();
5153
serviceCollection.AddSingleton<IChatService, ChatService>();
5254

5355
serviceCollection.AddTransient<ChatMessageViewModel>();

ChatGptCom/ChatService.cs

Lines changed: 0 additions & 113 deletions
This file was deleted.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using AI.Model.Services;
2+
using Newtonsoft.Json;
3+
4+
namespace ChatGptCom;
5+
6+
public class NewtonsoftChatSerializer : IChatSerializer
7+
{
8+
private static readonly JsonSerializerSettings s_settings;
9+
10+
static NewtonsoftChatSerializer()
11+
{
12+
s_settings = new JsonSerializerSettings
13+
{
14+
Formatting = Formatting.Indented,
15+
NullValueHandling = NullValueHandling.Ignore,
16+
};
17+
}
18+
19+
public string Serialize<T>(T value)
20+
{
21+
return JsonConvert.SerializeObject(value, s_settings);
22+
}
23+
24+
public T? Deserialize<T>(string json)
25+
{
26+
return JsonConvert.DeserializeObject<T>(json, s_settings);
27+
}
28+
}

0 commit comments

Comments
 (0)