您需要将
[DataContract]属性添加到
Person类中,并将
[DataMember]属性添加到要序列化的每个属性和字段中:
[DataContract]public class Person : PropertyChangedbase{ [DataMember] public int Id { get; set; } private string _firstName; [DataMember] public string FirstName { get; set; }}
您需要这样做,因为caliburn.micro基类
PropertyChangedbase具有以下
[DataContract]属性:
namespace Caliburn.Micro { [DataContract] public class PropertyChangedbase : INotifyPropertyChangedEx { }}
但是为什么这是必要的呢?从理论上讲,
DataContractAttribute适用于基类的存在
不应
影响派生
Person类,因为
DataContractAttributesets
AttributeUsageAttribute.Inherited= false:
[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Struct|AttributeTargets.Enum, Inherited = false, AllowMultiple = false)]public sealed class DataContractAttribute : Attribute
但是,
HttpClientExtensions.PostAsJsonAsync使用的默认实例
JsonMediaTypeFormatter,默认情况下使用Json.NET库执行序列化。
而Json.NET不尊重
Inherited =false的属性
DataContractAttribute,如解释在这里
[Json.NET]在基类上检测到DataContractAttribute并假定选择加入序列化。
(有关确认,请参阅有关DataContract#872的继承行为的问题,该问题确认Json.NET的这种行为仍然是预期的。)
因此,您毕竟需要添加这些属性。
另外,如果您不想在所有派生类上都应用数据协定属性,则可以切换到
DataContractJsonSerializer以下说明:ASP.NET Web
API中的JSON和XML序列化:
如果愿意,可以将 JsonMediaTypeFormatter 类配置为使用 DataContractJsonSerializer
而不是Json.NET。为此,请将 UseDataContractJsonSerializer 属性设置为 true :var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;json.UseDataContractJsonSerializer = true;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)