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

时间:2012-09-24 08:27:43

标签: c#

  

可能重复:
  Why XML-Serializable class need a parameterless constructor

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

  

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

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

6 个答案:

答案 0 :(得分:6)

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

object obj = Activator.CreateInstance(type);

的使用。

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

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

答案 1 :(得分:2)

不,这不是关于MVC (抱歉,我误读了你的帖子)。它只是关于普通的C#'py对象创建。你看,以这个课为例:

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

现在不要确切报告问题的详细信息,但通常会说:

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

答案 5 :(得分:0)

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

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