Подтвердить что ты не робот

Json.net не сериализует свойства из производного класса

Я использую JSON.NET 6.0.1. Когда я использую метод SerializeObject для сериализации объекта моего производного класса, он сериализует свойства только из базового класса. Вот фрагмент кода:

string v = JsonConvert.SerializeObject(
                service, 
                Formatting.Indented, 
                new JsonSerializerSettings()
                {
                    TypeNameHandling = TypeNameHandling.All
                });

базовый класс:

[DataContract]
public abstract partial class DataEntity : IDataEntity, INotifyPropertyChanging, INotifyPropertyChanged
{
    ...
}

производный класс:

[Table(Name = "dbo.mytable")]
public sealed class mytable : DataEntity
{
    ...
}

Я что-то пропустил?

4b9b3361

Ответ 1

Да, вам не хватает атрибут [DataContract] в производном классе. Вам также нужно добавить [DataMember] к любым свойствам или полям, которые вы хотите сериализовать, если вы еще не добавили их. Это указано в документации для класса DataContractAttribute, как указано ниже (акцент мой):

Примечание

Контракт данных существенно отличается от фактического интерфейса в его наследовании. Интерфейсы наследуются любыми производными типами. При применении DataContractAttribute к базовому классу производные типы не наследуют атрибут или поведение. Однако, если производный тип имеет контракт с данными, члены данных базового класса сериализуются. Однако вы должны применить DataMemberAttribute к новым членам производного класса, чтобы сделать их сериализуемыми.

Json.Net был изменен, чтобы почитать это поведение в версии 5.0 версии 1 (апрель 2013 г.).

Обратите внимание, что если вы удаляете из своих классов все экземпляры [DataContract] и [DataMemeber], Json.Net ведет себя по-другому: в этом случае поведение по умолчанию для Json.Net заключается в сериализации всех общедоступных свойств, как в базе и производные классы.

Ответ 2

JsonConvert.SerializeObject был для меня только return {}. Я обнаружил, что мне нужно добавить новый конструктор в класс, прежде чем он будет правильно сериализован.