当前位置: 首页 > 面试题库 >

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

夏侯枫
2023-03-14
问题内容

我正在开发使用caliburn.micro进行前端和使用Asp.net WebApi 2进行后端的客户端/服务器数据驱动的应用程序。

public class Person
{
    public int Id {get;set;}
    public string FirstName{get;set;}
    ...
}

该应用程序包含一个名为“
Person”的类。使用简单的REST协议,“个人”对象被序列化(JSON),并从客户端到服务器来回移动。该解决方案工作正常,没有任何问题。

问题:

为了实现NotifyOfPropertyChanged(),我为“人”设置了父类“ PropertyChangedBase”。

public class Person : PropertyChangedBase
{
    public int Id {get;set;}

    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set
        {
            _firstName = value;
            NotifyOfPropertyChange(() => FirstName);
        }
    }
    ...
}

但是这一次,类“ Person”的属性在接收端具有NULL值。

我猜序列化/反序列化有问题。这仅在实现PropertyChangedBase时发生。

谁能帮助我克服这个问题?


问题答案:

您需要将[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类,因为DataContractAttributesetsAttributeUsageAttribute.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;


 类似资料:
  • 我坐下来试着实施脑力操。语法似乎很简单。我很难让这个愚蠢的东西发挥作用。我做这件事已经有一段时间了;我承认我需要一些睡眠。也许这就是问题所在。翻译没有输出任何东西。我很确定问题很简单;我知道,在我更好地掌握了这个程序的发展方向之后,我需要对一些函数调用进行模块化。为什么我没有得到输出? 是大脑操的“你好世界”

  • 对于某些用例,我需要将一个POJO转换为另一个具有不同字段名称的POJO。我试着使用Jackson对象映射器。它在某些方面起了作用。然而,最终的结果并不是我所期望的。 如果运行,输出将是: SOUT:UserMap{name_new='Deepak',meta=address::Singapore,id::111} 杰克逊:{“姓名”:“迪帕克”,“地址”:“新加坡”,“身份证”:“111”} 我

  • 问题内容: 像其他几个人一样,我在序列化Entity Framework对象时遇到问题,因此我可以通过JSON格式的AJAX发送数据。 我有以下服务器端方法,我正在尝试通过jQuery使用AJAX进行调用 通过AJAX调用会导致此错误: 这是因为实体框架创建循环引用以保持所有对象相关并且可访问服务器端的方式。 我从(http://hellowebapps.com/2010-09-26/produc

  • 问题内容: 我有一个包含三个字段的单一对象:两个字符串和一个 我想做的是将这些对象中的一个保存到文件中,但是我不断收到 我用来存储文件的代码: 未初始化drawable时,一切正常。在此先感谢您的帮助。 问题答案: java.io.NotSerializableException: android.graphics.drawable.BitmapDrawable 该消息看起来非常清晰- 字段中的特

  • 问题内容: 每当我尝试序列化文件时,都会收到错误消息:FileNotFound。不知道为什么。这是我的FileHelper代码: 问题答案:

  • 目前,我正在使用Avro1.8.0序列化/反序列化对象,但面临一些问题,特别是java.util.Map对象。不面临其他类型对象的问题。 这里的示例代码- 在deserialize方法中,我试图根据输入数据获取模式,但avro抛出错误- 多谢了。