我正在编写代码来进行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.ModelScope.GetTypeModel的System.Xml.Serialization.TypeScope.GetTypeDesc(Type type,MemberInfo sourc e,Boolean directReference,Boolean throwOnError)中的System.Xml.Serialization.TypeDesc.CheckSupported()处于类型类型, System.Xml.Serialization上的System.Xml.Serialization.XmlSerializer..ctor(Type type,String defaultName space)中System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type,XmlRootAttribute root,String defaultNamespace)的布尔直接引用. XmlSerializer..ctor(类型类型)
为什么必须有一个无参数构造函数才能使xml序列化成功?
编辑:感谢cfeduke的回答.无参数构造函数可以是私有的或内部的.
在对象的反序列化期间,负责反序列化对象的类创建序列化类的实例,然后仅在获取要填充的实例后才继续填充序列化的字段和属性.
你可以制作你的构造函数private
,internal
如果你想要的话,只要它是无参数的.
这是一个限制XmlSerializer
.请注意,BinaryFormatter
并DataContractSerializer
没有要求这一点-他们可以出醚创建一个初始化的对象和反序列化过程中初始化.
由于您使用的是xml,因此可以考虑使用/ ] 来DataContractSerializer
标记您的类,但请注意,这会更改模式(例如,没有相应的- 所有内容都成为元素).[DataContract]
[DataMember
[XmlAttribute]
更新:如果你真的想知道,BinaryFormatter
等人FormatterServices.GetUninitializedObject()
用来创建对象而不调用构造函数.可能很危险; 我不建议经常使用它;-p另请参阅MSDN上的备注:
因为对象的新实例初始化为零并且没有运行构造函数,所以该对象可能不表示该对象认为有效的状态.当用户打算立即填充所有字段时,当前方法只应用于反序列化.它不会创建未初始化的字符串,因为创建不可变类型的空实例没有任何意义.
我有自己的序列化引擎,但我不打算使用它FormatterServices
; 我非常想知道构造函数(任何构造函数)实际执行过.