C# Сериализация универсального класса-оболочкиC#

Место общения программистов C#
Ответить
Гость
 C# Сериализация универсального класса-оболочки

Сообщение Гость »


Я пытаюсь реализовать сериализацию JSON для класса-оболочки Optional. Я хочу, чтобы сериализация была похожа на тип, допускающий значение NULL, поэтому:

"myOptional": ноль для нуля и

"myOptional": 2 или

"myOptional": { . . . } для объектов.

Это нормально, пока я не доберусь до завернутого объекта, я не знаю, как приказать сериализатору «сериализовать этот объект, как обычно». Документы Microsoft наводят меня на мысль, что мне нужно реализовать JsonConverterFactory, но я не знаю, как указать писателю автоматически сериализовать внутренний объект.

публичный классOptionalTypeJsonConverterFactory: JsonConverterFactory { общедоступное переопределение bool CanConvert (Тип typeToConvert) { тип возвращаемого значенияToConvert .GetGenericArguments()[0].IsClass; } публичное переопределение JsonConverter CreateConverter( Тип типа, Параметры JsonSerializerOptions ) { вернуть (JsonConverter)Activator.CreateInstance( тип: typeof(OptionalJsonConverter).MakeGenericType(type.GenericTypeArguments[0]), привязкаAttr: BindingFlags.Instance | BindingFlags.Public, связующее: ноль, аргументы: новый объект[] {опции}, культура: ноль )!; } частный классOptionalJsonConverter: JsonConverter где Т: структура { publicOptionalJsonConverter(параметры JsonSerializerOptions) {} общедоступное переопределение Необязательно? Читать( ссылка на программу чтения Utf8JsonReader, Введите типToConvert, Параметры JsonSerializerOptions ) { выбросить новое NotImplementedException(); } публичное переопределение void Write( Utf8JsonWriter писатель, Необязательный необязательный, Параметры JsonSerializerOptions ) { если (необязательно.IsNone()) { писатель.WriteNullValue(); } еще { // не знаю, что здесь написать. Я хочу сериализовать объекты так, как будто оболочки никогда не было. } } } } Как мне этого добиться? Например, если Optional имеет T = MyClass и MyClass равен

{ общественный int ID {получить; набор; } = 2 общедоступная строка Имя {get; набор; } = "мое имя" } затем я хочу, чтобы это было сериализовано
"optionalofMyClass": { «ИД»: 2, «Имя»: «мое имя» }
Ответить

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

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

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

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

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