Browse Source

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

tags/v0.5.1
Martin Evans 2 years ago
parent
commit
77aa5fa0d0
2 changed files with 21 additions and 23 deletions
  1. +2
    -23
      LLama.Unittest/ModelsParamsTests.cs
  2. +19
    -0
      LLama/Common/ModelParams.cs

+ 2
- 23
LLama.Unittest/ModelsParamsTests.cs 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()
{


+ 19
- 0
LLama/Common/ModelParams.cs 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);
}
}
}

Loading…
Cancel
Save