Skip to content

Create Injectable and static serialisers #1247

@StuartFerguson

Description

@StuartFerguson
public interface ISerializer
{
    string Serialize<T>(T obj);
    T Deserialize<T>(string json);
}
public class SystemTextJsonSerializer : ISerializer
{
    private readonly JsonSerializerOptions _options;

    public SystemTextJsonSerializer(JsonSerializerOptions options)
    {
        _options = options;
    }

    public string Serialize<T>(T obj)
    {
        return JsonSerializer.Serialize(obj, _options);
    }

    public T Deserialize<T>(string json)
    {
        return JsonSerializer.Deserialize<T>(json, _options)!;
    }
}
public class NewtonsoftJsonSerializer : ISerializer
{
    private readonly JsonSerializerSettings _settings;

    public NewtonsoftJsonSerializer(JsonSerializerSettings settings)
    {
        _settings = settings;
    }

    public string Serialize<T>(T obj)
    {
        return JsonConvert.SerializeObject(obj, _settings);
    }

    public T Deserialize<T>(string json)
    {
        return JsonConvert.DeserializeObject<T>(json, _settings)!;
    }
}

DI registration

builder.Services.AddSingleton<ISerializer>(sp =>
{
    var options = new JsonSerializerOptions
    {
        PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower
    };

    return new SystemTextJsonSerializer(options);
});

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.PropertyNamingPolicy =
            JsonNamingPolicy.CamelCase;
    });

Or add a static wrapper like we do with Logger

Serialiser.Initialise(new SystemTextJsonSerializer());

Metadata

Metadata

Assignees

No one assigned

    Labels

    taskTasks and work items

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions