为什么xml-可序列化类需要无参数构造函数?

为什么xml-可序列化类需要无参数构造函数?

我正在编写代码来执行XML序列化。具有以下功能。

public static string SerializeToXml(object obj){
    XmlSerializer serializer = new XmlSerializer(obj.GetType());
    using (StringWriter writer = new StringWriter())
    {
        serializer.Serialize(writer, obj);
        return writer.ToString();
    }}

如果参数是一个没有无参数构造函数的类的实例,它将抛出一个异常。

未处理的异常:System.InvalidOperationException:CSharpConsole.foo无法序列化,因为它没有无参数的构造函数。在System.Xml.Serialization.TypeDesc.CheckSupported()(System.Xml.Serialization.TypeScope.GetTypeDesc(Type类型)、MemberInfoSource(System.Xml.Serialization.ModelScope.GetTypeModel(Type类型)、System.Xml.Serialization.ModelScope.GetTypeModel(Type类型(System.Xml.Serialization.ModelScope.GetTypeModel(Type类型)、System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type类型(布尔直接引用)、System.Xml.Serialization.XmlSerializer..ctor(Type类型下的XmlRootAttribute根、StringdefaultNamesspace(System.Xml.Serialization.XmlSerializer..ctor(Type类型)、StringdefaultName空间(System.Xml.Serialization.XmlSerializer..ctor(Type类型)

为什么必须有一个无参数构造函数才能使XML序列化成功?

编辑:谢谢cfeduke的回答。无参数构造函数可以是私有的,也可以是内部的。


白衣染霜花
浏览 963回答 3
3回答

小唯快跑啊

在对象反序列化期间,负责反序列化对象的类创建序列化类的实例,然后在获取要填充的实例后才开始填充序列化字段和属性。你可以让你的构造函数private或internal如果你愿意,只要它没有参数。

皈依舞

这是对…的限制XmlSerializer..请注意BinaryFormatter和DataContractSerializer 不要需要这样做-他们可以创建一个未初始化的对象的乙醚,并在反序列化期间初始化它。由于您使用的是xml,因此可以考虑使用DataContractSerializer用[DataContract]/[DataMember,但是请注意,这会更改模式(例如,没有等效的[XmlAttribute]-一切都成为要素)。更新:如果你真的想知道,BinaryFormatter等用途FormatterServices.GetUninitializedObject()若要创建对象而不调用构造函数,请执行以下操作。可能很危险;我不建议经常使用它;-p还可以看到MSDN上的注释:由于对象的新实例初始化为零,并且没有运行构造函数,因此该对象可能不表示该对象认为有效的状态。只有当用户打算立即填充所有字段时,才应使用当前方法进行反序列化。它不会创建未初始化的字符串,因为创建不可变类型的空实例没有任何用途。我有我的自己序列化引擎,但我不打算让它使用FormatterServices我很喜欢知道构造函数(任何构造函数)实际上已经执行。
打开App,查看更多内容
随时随地看视频慕课网APP