5

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

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

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

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

4

6 回答 6

7

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

object obj = Activator.CreateInstance(type);

用法。

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

  • 有些序列化程序不使用任何构造函数(还有另一种创建对象的方法,完全跳过构造函数步骤)
  • 有序列化程序允许您提供自己的工厂方法来创建新实例
于 2012-09-24T08:31:44.223 回答
3

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

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

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

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

于 2012-09-24T08:30:13.477 回答
1

它是必需的,以便对参数化构造函数一无所知的代码可以根据无参数构造函数可用的约定来构造您的对象之一。

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

于 2012-09-24T08:29:01.693 回答
1

用于反序列化以创建实例。如果您想隐藏它,您可以进行私有或内部构造。

于 2012-09-24T08:30:33.300 回答
0

现在不要确切报告问题的详细信息,但一般来说:

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

于 2012-09-24T08:30:06.207 回答
0

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

如果没有无参数构造函数,反序列化器将不得不猜测要发送给构造函数的参数。如果有一个关于构造函数应该具有哪些参数的约定,那么这可能会很好地工作,但最简单的约定是应该有一个没有参数的构造函数。

于 2012-09-24T08:30:55.457 回答