【问题标题】:What role plays constructor in xmlserialize class?构造函数在 xmlserialize 类中扮演什么角色?
【发布时间】:2018-01-25 14:30:22
【问题描述】:

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

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

提前致谢。

【问题讨论】:

标签: c# xml xmlserializer xml-deserialization


【解决方案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 根本没有构造函数,则默认构造函数是隐式为您创建的。在这种情况下,您可以通过反射节省地创建实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-18
    • 2020-01-25
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多