【发布时间】:2018-01-25 14:30:22
【问题描述】:
我之前一直在尝试反序列化 xml 文件,但遇到了序列化程序找不到根元素的问题。然后我创建了构造函数,一切正常。
谁能解释一下为什么会这样?
提前致谢。
【问题讨论】:
标签: c# xml xmlserializer xml-deserialization
我之前一直在尝试反序列化 xml 文件,但遇到了序列化程序找不到根元素的问题。然后我创建了构造函数,一切正常。
谁能解释一下为什么会这样?
提前致谢。
【问题讨论】:
标签: c# xml xmlserializer xml-deserialization
XmlSerializer 将通过反射创建您的类型的实例。为此,它必须能够实例化你的类,这是通过使用它的default-constructor。如果您没有,则序列化程序无法创建实例。
这或多或少是一回事,序列化程序也会这样做:
Type type = // read type from XmlReader
var instance = Activator.CreateInstance(type);
property.SetProperty(instance, theValue);
Activator.CreateInstance 但是假定一个无参数(=默认)构造函数。因此,如果您的类定义了另一个构造函数,Activator 无法创建实例,因为它不知道调用 现有 构造函数的参数,请参见此处:
public class MyClass
{
public string MyString { get; set; }
public MyClass(string someString) { this.MyString = someString; }
}
这里Activator 尝试创建MyClass 的实例没有任何参数,因为它根本不知道更好。但是MyClass 将字符串作为参数除外,导致调用失败。
另一方面,如果MyClass 根本没有构造函数,则默认构造函数是隐式为您创建的。在这种情况下,您可以通过反射节省地创建实例。
【讨论】: