构造函数在 xmlserialize class 中扮演什么角色?

What role plays constructor in xmlserialize class?

前段时间我一直在尝试反序列化 xml 文件,但遇到序列化程序找不到根元素的问题。然后我创建了构造函数,一切正常。

谁能解释一下为什么会这样?

提前致谢。

XmlSerializer 将通过反射创建您的类型的实例。为此,它必须能够 实例化 您的 classes,这是通过使用其 默认构造函数 。如果您没有,序列化程序将无法创建实例。

这或多或少是同一件事,因为序列化程序也会这样做:

Type type = // read type from XmlReader
var instance = Activator.CreateInstance(type);
property.SetProperty(instance, theValue);

Activator.CreateInstance 但是假定一个无参数(=默认)构造函数。因此,如果您的 class 定义了另一个构造函数,Activator 无法创建实例,因为它不知道调用 existing 构造函数的参数,请参见此处:

public class MyClass
{
    public string MyString { get; set; }
    public MyClass(string someString) { this.MyString = someString; }
}

这里 Activator 尝试创建一个 MyClass 没有 任何参数的实例,因为它根本不知道更好。但是 MyClass 将字符串作为参数除外,导致调用失败。

如果另一方面 MyClass 根本没有构造函数,则默认构造函数是 隐含地 为您创建的。在这种情况下,您可以通过反射来安全地创建实例。