构造函数在 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
根本没有构造函数,则默认构造函数是 隐含地 为您创建的。在这种情况下,您可以通过反射来安全地创建实例。
前段时间我一直在尝试反序列化 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
根本没有构造函数,则默认构造函数是 隐含地 为您创建的。在这种情况下,您可以通过反射来安全地创建实例。