Свойства .NET в производном классе по умолчанию не сериализуются с помощью Json.Net

#c# #f# #json.net #json-serialization

#c# #f# #json.net #json-сериализация

Вопрос:

Я пишу код на F # и мне нужно использовать существующие библиотеки C # с определенными классами POCO, эти классы не помечены DataContractAttribute . Мне нужно наследовать от них и добавлять свойства в производный класс, затем я создаю экземпляр производного класса и сериализую его в Json с помощью Newtonsoft Json.NET . Во что бы то ни стало, поскольку не используются атрибуты DataContract или DataMember, все свойства должны быть сериализованы по умолчанию. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу сериализовать все свойства

  1. Если я просто сериализую производный объект, сериализуются только свойства базового класса
  2. Если я отмечу производный класс с помощью DataContractAttribute, ничего не будет сериализовано
  3. Если я добавлю атрибут DataMemberAttribute к производным свойствам, то сериализуются только производные свойства

Итак, чтобы сериализовать все свойства (как базовые, так и производные), единственным способом было бы пометить оба класса DataContractAttribute , а все свойства DataMemberAttribute .

Есть ли способ просто сериализовать все свойства (как базовые, так и производные) без добавления каких-либо атрибутов вообще?

Я использую JsonSerializer.Сериализовать(JsonWriter, obj, obj.GetType())

Обновить

После еще нескольких тестов я думаю, что проблема в том, что мой производный класс находится в F #. Я выполнил следующий тест

 //C#

public class A {
    public string AA { get; set; } = "AA"
}

public class B : A {
    public string BB { get; set; } = "BB"
}

//F#
type C() = 
    inherit B()
    let mutable c = "CC"
    member public _.CC
        with get() = c
        and set value = c <- value
 

Если я попытаюсь сериализовать экземпляр C, сериализуются только AA и BB, CC не сериализуется.

Кто-нибудь знает, как исправить эту проблему?

Комментарии:

1. Удивительно. Похоже, не удается воспроизвести с помощью онлайн-скрипки, см. dotnetfiddle.net/lOgDWz .

2. @dbc Я использую Newtonsoft.Json. JsonSerializer и Newtonsoft.Json. JsonTestWriter

3. Привет, @franco-tiveron! Какая версия среды выполнения и какая у вас ОС? Кажется, это работает на моей Windows 10 x64 . Рабочая станция NET Core 3.1 🙂

4. @Viacheslav то же, что и у вас, однако я использую не последнюю версию Newtonsoft (для совместимости с другими библиотеками, которые мне нужно использовать). Я изменил дизайн своего кода, используя инкапсуляцию вместо наследования, и получил то, что мне было нужно