c# - json.net no serializa propiedades de la clase derivada
serialization (2)
Estoy usando JSON.NET 6.0.1. Cuando uso el método SerializeObject
para serializar un objeto de mi clase derivada, serializa las propiedades solo de la clase base. Aquí está el fragmento de código:
string v = JsonConvert.SerializeObject(
service,
Formatting.Indented,
new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.All
});
clase base:
[DataContract]
public abstract partial class DataEntity : IDataEntity, INotifyPropertyChanging, INotifyPropertyChanged
{
...
}
clase derivada:
[Table(Name = "dbo.mytable")]
public sealed class mytable : DataEntity
{
...
}
¿Me estoy perdiendo de algo?
Sí, falta el atributo [DataContract]
en la clase derivada. También debe agregar [DataMember]
a cualquier propiedad o campo que desee serializar, si aún no los ha agregado. Esto se detalla en la documentación de la clase DataContractAttribute
, como se cita a continuación (énfasis mío):
Nota
Un contrato de datos difiere significativamente de una interfaz real en su comportamiento de herencia. Las interfaces son heredadas por cualquier tipo derivado. Cuando aplica DataContractAttribute a una clase base, los tipos derivados no heredan el atributo o el comportamiento. Sin embargo, si un tipo derivado tiene un contrato de datos, los miembros de datos de la clase base se serializan. Sin embargo, debe aplicar DataMemberAttribute a los nuevos miembros en una clase derivada para que sean serializables.
Json.Net se cambió para cumplir este comportamiento en la versión 5.0 versión 1 (abril de 2013).
Tenga en cuenta que si elimina todas las instancias de [DataContract]
y [DataMemeber]
de sus clases, Json.Net se comporta de manera diferente: en ese caso, el comportamiento predeterminado es que Json.Net serialice todas las propiedades públicas, tanto en la base como en las clases derivadas .
JsonConvert.SerializeObject solo devolvió {} para mí. Descubrí que necesitaba agregar un nuevo constructor a la clase antes de que se serializara correctamente.