Newtonsoft. Json Сериализация / десериализация стати c класс - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть класс stati c, пример:

public static Config
{
    public static string ServerIP;
    ...
}

Я сделал это stati c, потому что к нему легко получить доступ во всем приложении.

Проблема Теперь, как я могу сериализовать / десериализовать его? Потому что эти настройки будут меняться, и использование может изменить значение в файле json.

1 Ответ

0 голосов
/ 24 февраля 2020

Ни System.Text. Json, ни Newtonsoft. Json не поддерживают сериализацию классов stati c. Поэтому, хотя вы не можете сериализовать класс напрямую, вы можете сериализовать его члены.

Если вы можете использовать Newtonsoft. Json, то вы можете подобрать что-то подобное, по крайней мере, для десериализации и нечто подобное для сериализации. :

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

static class Config
{
    public static string ServerIP = string.Empty;
}

static void DeserializeStaticClass(string json, Type staticClassType)
{
    if (!staticClassType.IsClass)
        throw new ArgumentException("Type must be a class", nameof(staticClassType));

    if (!staticClassType.IsAbstract || !staticClassType.IsSealed)
        throw new ArgumentException("Type must be static", nameof(staticClassType));

    var document = JObject.Parse(json);
    var classFields = staticClassType.GetFields(BindingFlags.Public | BindingFlags.Static);

    foreach (var field in classFields)
    {
        var documentField = document[field.Name];
        if (documentField == null)
            throw new JsonSerializationException($"Not found in JSON: {field.Name}");
        field.SetValue(null, documentField.ToObject(field.FieldType));
    }
}

...

DeserializeStaticClass("{\"ServerIP\": \"localhost\"}", typeof(Config));

Если вам нужно настроить сериализацию вложенных элементов, вы можете передать JsonSerializer в documentField.ToObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...