在xmlserialize类中扮演构造函数的角色是什么?

时间:2018-01-25 14:30:22

标签: c# xml xmlserializer xml-deserialization

我一直试图在前一段时间反序列化xml文件,并且遇到串口发生器无法找到根元素的问题。然后我创建了构造函数,一切正常。

任何人都可以解释一下,为什么会发生这种情况?

提前致谢。

1 个答案:

答案 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根本没有构造函数,默认构造函数隐含为您创建。在这种情况下,您可以通过反射来保存创建实例。