Например, при написании пользовательских конвертеров «под капотом» System.Text.Json общепринятым способом получения «зарегистрированного» JsonConverter является вызов options.GetConverter(...) с передачей типа для преобразования.< /p>
Метод возвращает неуниверсальный тип JsonConverter, даже если все преобразователи являются универсальными, т. е. имеют тип JsonConverter. Неуниверсальный тип нельзя использовать для сериализации/десериализации, поскольку он не имеет необходимых методов чтения/записи.
Это привело меня к тому, что я «выплеснул ребенка вместе с водой из ванны». ' и отказ от встроенного реестра преобразователя и JsonSerializerOption.GetConverter(...) в пользу словаря, который сопоставляет типы с специфичными для типа делегатами «сериализатора» или «десериализатора», которые выполняют необходимые операции чтения/записи.
Они могут быть написаны с использованием существующего реестра конвертеров следующим образом:
Это хлопотно, но относительно организовано и легко выполнимо.
Тем не менее, это кажется излишним.
Итак, мой вопрос или вопросы таковы:
- Есть ли лучшее решение для этого старого каштана?
- Действительно ли невозможно решить проблему общей типизацией необобщенного базового типа к его универсальному эквиваленту, даже если это реализованная форма без явного объявления типа, как в приведенном ниже фрагменте кода (т. е. используя Type, а не ), или дженерики C# здесь слишком ограничительны?
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