实施PropertyChangedBase时caliburn.micro序列化问题

实施PropertyChangedBase时caliburn.micro序列化问题,第1张

实施PropertyChangedBase时caliburn.micro序列化问题

您需要将

[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
类,因为
DataContractAttribute
sets
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;


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5051273.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存