json.net ne sérialise pas les propriétés de la classe dérivée
Je suis en utilisant JSON.NET 6.0.1. Lorsque j'utilise le SerializeObject
méthode pour sérialiser un objet de ma classe dérivée, il sérialise les propriétés de la classe de base seulement. Voici l'extrait de code:
string v = JsonConvert.SerializeObject(
service,
Formatting.Indented,
new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.All
});
de la classe de base:
[DataContract]
public abstract partial class DataEntity : IDataEntity, INotifyPropertyChanging, INotifyPropertyChanged
{
...
}
classe dérivée:
[Table(Name = "dbo.mytable")]
public sealed class mytable : DataEntity
{
...
}
Suis-je raté quelque chose?
source d'informationauteur frosty
Vous devez vous connecter pour publier un commentaire.
Oui, il vous manque le
[DataContract]
l'attribut de la classe dérivée. Vous devez également ajouter[DataMember]
à toutes les propriétés ou les champs que vous souhaitez sérialisé, si vous n'avez pas déjà ajouté. Ce qui est énoncé dans la documentation pour leDataContractAttribute
de la classecomme cité ci-dessous (l'emphase est mienne):Json.Net a été changé à l'honneur ce comportement dans version 5.0 1 (avril 2013).
Notez que si vous supprimer toutes les instances de
[DataContract]
et[DataMemeber]
de vos classes, de l'Json.Net se comporte différemment: dans ce cas, le comportement par défaut est de Json.Net pour sérialiser toutes les propriétés publiques, à la fois dans les classes de base et dérivées.L'ajout de l'attribut
[JsonObject(MemberSerialization.OptOut)]
à votre classe dérivée va inclure tous les membres du public à être sérialisé.Alternativement, si vous voulez seulement certaines propriétés de votre classe dérivée doit être sérialisé vous pouvez ajouter l'attribut
[JsonProperty]
à chacun (Ce serait l'équivalent de l'ajout de[DataMember]
pour chaque propriété avec[DataContract]
sur la classe).JsonConvert.SerializeObject était seulement de retour {} pour moi. J'ai trouvé que je devais ajouter un nouveau constructeur de la classe avant de sérialisé correctement.