#c# #f# #json.net #json-serialization
#c# #f# #json.net #json-сериализация
Вопрос:
Я пишу код на F # и мне нужно использовать существующие библиотеки C # с определенными классами POCO, эти классы не помечены DataContractAttribute . Мне нужно наследовать от них и добавлять свойства в производный класс, затем я создаю экземпляр производного класса и сериализую его в Json с помощью Newtonsoft Json.NET . Во что бы то ни стало, поскольку не используются атрибуты DataContract или DataMember, все свойства должны быть сериализованы по умолчанию. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу сериализовать все свойства
- Если я просто сериализую производный объект, сериализуются только свойства базового класса
- Если я отмечу производный класс с помощью DataContractAttribute, ничего не будет сериализовано
- Если я добавлю атрибут 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 (для совместимости с другими библиотеками, которые мне нужно использовать). Я изменил дизайн своего кода, используя инкапсуляцию вместо наследования, и получил то, что мне было нужно