Как разрешить общую форму JsonConverter в System.Text.JsonC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как разрешить общую форму JsonConverter в System.Text.Json

Сообщение Anonymous »

Я знаю, что эта проблема больше связана с ограничениями универсальных шаблонов C#, чем с сериализацией JSON .NET Core (8.0), но это сводит меня с ума.
Например, при написании пользовательских конвертеров «под капотом» System.Text.Json общепринятым способом получения «зарегистрированного» JsonConverter является вызов options.GetConverter(...) с передачей типа для преобразования.< /p>
Метод возвращает неуниверсальный тип JsonConverter, даже если все преобразователи являются универсальными, т. е. имеют тип JsonConverter. Неуниверсальный тип нельзя использовать для сериализации/десериализации, поскольку он не имеет необходимых методов чтения/записи.
Это привело меня к тому, что я «выплеснул ребенка вместе с водой из ванны». ' и отказ от встроенного реестра преобразователя и JsonSerializerOption.GetConverter(...) в пользу словаря, который сопоставляет типы с специфичными для типа делегатами «сериализатора» или «десериализатора», которые выполняют необходимые операции чтения/записи.
Они могут быть написаны с использованием существующего реестра конвертеров следующим образом:
Это хлопотно, но относительно организовано и легко выполнимо.
Тем не менее, это кажется излишним.
Итак, мой вопрос или вопросы таковы:
  • Есть ли лучшее решение для этого старого каштана?
  • Действительно ли невозможно решить проблему общей типизацией необобщенного базового типа к его универсальному эквиваленту, даже если это реализованная форма без явного объявления типа, как в приведенном ниже фрагменте кода (т. е. используя Type, а не ), или дженерики C# здесь слишком ограничительны?
private delegate void Serializer(Utf8JsonWriter writer, object? value, JsonSerializerOptions options);

private static readonly Dictionary _Serializers = new Dictionary
{
{ typeof(string), SerializeStringValue }
};

private static void SerializeStringValue(Utf8JsonWriter writer, object? value, JsonSerializerOptions options)
{
var converter = options.GetConverter(typeof(string));
if (value is string stringValue && converter is JsonConverter stringConverter)
{
stringConverter.Write(writer, stringValue, options);
}
else
{
writer.WriteNullValue();
}
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... -text-json
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»