Added `JsonConverter` attribute, so System.Text.Json serialization is seamless

This commit is contained in:
Martin Evans 2023-08-24 16:17:49 +01:00
parent ee772a2921
commit 77aa5fa0d0
2 changed files with 21 additions and 23 deletions

View File

@ -19,33 +19,12 @@ namespace LLama.Unittest
GpuLayerCount = 111
};
var options = new System.Text.Json.JsonSerializerOptions();
options.Converters.Add(new SystemTextJsonEncodingConverter());
var json = System.Text.Json.JsonSerializer.Serialize(expected, options);
var actual = System.Text.Json.JsonSerializer.Deserialize<ModelParams>(json, options);
var json = System.Text.Json.JsonSerializer.Serialize(expected);
var actual = System.Text.Json.JsonSerializer.Deserialize<ModelParams>(json);
Assert.Equal(expected, actual);
}
private class SystemTextJsonEncodingConverter
: System.Text.Json.Serialization.JsonConverter<Encoding>
{
public override Encoding? Read(ref System.Text.Json.Utf8JsonReader reader, Type typeToConvert, System.Text.Json.JsonSerializerOptions options)
{
var name = reader.GetString();
if (name == null)
return null;
return Encoding.GetEncoding(name);
}
public override void Write(System.Text.Json.Utf8JsonWriter writer, Encoding value, System.Text.Json.JsonSerializerOptions options)
{
writer.WriteStringValue(value.WebName);
}
}
[Fact]
public void SerializeRoundTripNewtonsoft()
{

View File

@ -1,6 +1,7 @@
using LLama.Abstractions;
using System;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace LLama.Common
@ -116,6 +117,7 @@ namespace LLama.Common
/// <summary>
/// The encoding to use to convert text for the model
/// </summary>
[JsonConverter(typeof(EncodingConverter))]
public Encoding Encoding { get; set; } = Encoding.UTF8;
/// <summary>
@ -188,4 +190,21 @@ namespace LLama.Common
Encoding = Encoding.GetEncoding(encoding);
}
}
internal class EncodingConverter
: JsonConverter<Encoding>
{
public override Encoding? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var name = reader.GetString();
if (name == null)
return null;
return Encoding.GetEncoding(name);
}
public override void Write(Utf8JsonWriter writer, Encoding value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.WebName);
}
}
}