为什么我需要一个无参数构造函数?

4 c#

可能重复:
为什么XML-Serializable类需要无参数构造函数

我收到如下所述的运行时错误.

Message = OutlookAddIn1.DeviceRegistrationRequest无法序列化,因为它没有无参数构造函数.

我很清楚为什么(它在错误消息中说)以及如何解决它(空构造函数的简单添加).我不清楚的是它为什么需要它.我发现了 这个讨论,但它主要是关于MVC,它与我的程序(CRM Dynamics的控制台客户端)无关.

Mar*_*ell 7

您的类只需要一个无参数的构造函数,因为您正在使用的库(听起来XmlSerializer,可能是间接的)期望并使用该构造函数.这确实是一种非常方便的创建对象的方法,因为它允许:

object obj = Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)

用法.

然而!这不是所有序列化程序的固有需求:

  • 有些序列化器不使用任何构造函数(还有另一种创建对象的方法,完全跳过构造函数步骤)
  • 有序列化器允许您提供自己的工厂方法来创建新实例


que*_*atl 3

不,这与 MVC 无关(抱歉,我误读了你的帖子)。它仅涉及普通的 C#'py 对象创建。你看,以这个类为例:

public class Why {
    public Why(int x, int y) { }
}
Run Code Online (Sandbox Code Playgroud)

当要反序列化和构造对象时,反序列化器如何知道要传递什么?他猜不出来。因此,框架要求可序列化对象必须具有无参数构造函数,因此“仅创建”是安全的,并且您有责任通过属性设置整个状态。

注意:顺便说一句 - 请注意构造函数不必是 public。大多数序列化器都可以很好地使用私有无参数构造函数,或者根本不需要,如果它们实现为使用未初始化的对象构造,则至少可以从 .Net 完整配置文件中的 Reflection 获得该构造函数。