我一直试图在前一段时间反序列化xml文件,并且遇到串口发生器无法找到根元素的问题。然后我创建了构造函数,一切正常。
任何人都可以解释一下,为什么会发生这种情况?
提前致谢。
答案 0 :(得分:1)
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
根本没有构造函数,默认构造函数隐含为您创建。在这种情况下,您可以通过反射来保存创建实例。