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

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

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

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

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

不,它不是MVC (对不起,我误读了你的post)。 它只是关于普通的C#’py对象创建。 你看,以这个类为例:

public class Why { public Why(int x, int y) { } } 

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

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

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

 object obj = Activator.CreateInstance(type); 

用法。

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

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

这是必需的,以便对参数化构造函数不了解的代码可以根据无参数构造函数可用的约定构造一个对象。

在反序列化时,需要对象实例,因此反序列化过程将使用此构造函数创建一个。

用于反序列化以创建实例。 如果你想隐藏它,你可以做私人或内部建构。

这是因为反序列化器需要能够轻松创建类的实例并用数据填充它。

如果没有无参数构造函数,则反序列化器必须猜测要发送给构造函数的参数。 如果有一个约定可以遵循构造函数应该具有的参数,那么这可以合理地工作,但最简单的约定是应该有一个没有参数的构造函数。

现在不要详细说明报告的问题,但通常会说:

您的序列化需要默认的 ctor才能构建类型的对象。 如果你没有它,它就无法做到。 它没有办法弄清楚,用参数传递给ctor的正确参数,所以它有“清除”无参数ctor。