为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白衣染霜花 2019-06-25 14:54:39
为什么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的回答。无参数构造函数可以是私有的,也可以是内部的。
查看完整描述

3 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

在对象反序列化期间,负责反序列化对象的类创建序列化类的实例,然后在获取要填充的实例后才开始填充序列化字段和属性。

你可以让你的构造函数privateinternal如果你愿意,只要它没有参数。


查看完整回答
反对 回复 2019-06-25
?
皈依舞

TA贡献1851条经验 获得超3个赞

这是对…的限制XmlSerializer..请注意BinaryFormatterDataContractSerializer 不要需要这样做-他们可以创建一个未初始化的对象的乙醚,并在反序列化期间初始化它。

由于您使用的是xml,因此可以考虑使用DataContractSerializer[DataContract]/[DataMember,但是请注意,这会更改模式(例如,没有等效的[XmlAttribute]-一切都成为要素)。

更新:如果你真的想知道,BinaryFormatter等用途FormatterServices.GetUninitializedObject()若要创建对象而不调用构造函数,请执行以下操作。可能很危险;我不建议经常使用它;-p还可以看到MSDN上的注释:

由于对象的新实例初始化为零,并且没有运行构造函数,因此该对象可能不表示该对象认为有效的状态。只有当用户打算立即填充所有字段时,才应使用当前方法进行反序列化。它不会创建未初始化的字符串,因为创建不可变类型的空实例没有任何用途。

我有我的自己序列化引擎,但我不打算让它使用FormatterServices我很喜欢知道构造函数(任何构造函数)实际上已经执行。


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 917 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信