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, «Имя»: «мое имя» }
Я пытаюсь реализовать сериализацию 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, «Имя»: «мое имя» }
Мобильная версия