XmlSerializer 类的使用

本文介绍了一个简单的C#类`User`用于演示如何通过XML进行序列化和反序列化操作。具体包括:定义一个包含姓名和年龄属性的`User`类,并使用`XmlSerializer`实现对象到XML文件的序列化及从XML文件读取对象的反序列化。

类User

using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Xml; using System.Collections.Generic; using System.Xml.Serialization; /// <summary> /// MyClass 的摘要说明 /// </summary> [XmlRoot("Config")] public class User {        private string _name=string.Empty;     private int _age=0;     [XmlAttribute("姓名")]     public string Name     {         get{return _name.ToString();}         set { _name = value; }     }

    [XmlElement("年龄")]     public int Age     {         get { return _age; }         set { _age = value; }     }    }

===========调用

using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.SqlClient; using System.Timers; using System.Xml.Serialization; using System.Xml; using System.IO; public partial class Default3 : System.Web.UI.Page {     protected void Page_Load(object sender, EventArgs e)     {                   }

    protected void Button1_Click(object sender, EventArgs e)     {                XmlReader xtReader = new XmlTextReader(Server.MapPath("~/text.xml"));         XmlSerializer xs = new XmlSerializer(typeof(User));         User data = (User)xs.Deserialize(xtReader);         Response.Write(data.ToString());         xtReader.Close();     }     protected void Button2_Click(object sender, EventArgs e)     {         User data = new User();         data.Name = "sun";              XmlSerializer xs = new XmlSerializer(typeof(User));         FileStream fs = new FileStream(Server.MapPath("~/text.xml"), FileMode.OpenOrCreate);         xs.Serialize(fs, data);         fs.Close();     } }

<think>好的,我现在需要帮助用户解决关于C#中XmlSerializer使用方法的问题。用户希望得到一个教程和示例代码。首先,我应该回顾用户提供的引用内容,看看是否有相关的信息可以整合。 引用[1]和引用[2]都提到了XmlSerializer的代码示例,特别是如何处理序化和反序化时的异常,以及如何配置XmlWriterSettings和命名空间。引用[3]虽然主要讲的是复杂数据型的序化,但提到了使用化回调属性,这可能对高级用法有帮助。 用户可能需要的步骤包括:创建XmlSerializer实例、序化对象到XML、反序XML回对象,以及处理常见问题,如命名空间和异常处理。我应该分步骤解释这些内容,并给出对应的代码示例,确保代码语法正确,符合用户的要求。 需要注意用户提到的系统级指令,比如行内数学表达式用$...$,但这里可能太需要数学公式,过要确保LaTeX语法正确。过用户的问题主要是代码相关,所以重点放在代码示例和解释上。 另外,用户希望生成相关问题,我需要考虑XmlSerializer的常见问题,比如如何处理复杂对象、性能优化、异常处理等。可能需要参考引用中的内容,比如复杂型处理(引用[3])和异常处理(引用[1]和[2])。 需要检查是否有遗漏的步骤,例如是否需要说明如何定义可序化的,比如Person的结构。用户提供的引用[2]中有一个Person,但代码可能完整,所以可能需要补充说明的定义需要可序化,包括公共属性和无参构造函数。 另外,用户可能遇到的问题,比如命名空间生成、缩进设置、处理特殊字符等,都需要在教程中提及。同时,异常处理的部分需要强调,比如传入null参数时的处理,如引用[1]中的代码示例所示。 最后,确保回答结构清晰,分步骤说明,代码示例正确,并且生成的相关问题能够覆盖用户可能进一步询问的方向。</think>### C# XmlSerializer 使用教程 #### 一、基础用法 XmlSerializer.NET 中用于对象与 XML 相互转换的核心。以下是最简实现步骤: 1. **定义可序** 要求必须包含公共无参构造函数,属性需为公共可写: ```csharp public class Person { public string Name { get; set; } public string Sex { get; set; } public int Age { get; set; } public Person() { } // 必须有无参构造函数 public Person(string name, string sex, int age) { Name = name; Sex = sex; Age = age; } } ``` 2. **序化对象到 XML** ```csharp var p1 = new Person("张三", "男", 20); using (FileStream fs = new FileStream("person.xml", FileMode.Create)) { XmlSerializer serializer = new XmlSerializer(typeof(Person)); serializer.Serialize(fs, p1); // 基础序化 } ``` 3. **反序XML 到对象** ```csharp using (FileStream fs = new FileStream("person.xml", FileMode.Open)) { XmlSerializer serializer = new XmlSerializer(typeof(Person)); Person p2 = (Person)serializer.Deserialize(fs); Console.WriteLine($"{p2.Name}-{p2.Sex}-{p2.Age}"); // 输出:张三-男-20 } ``` #### 二、高级配置 通过 `XmlWriterSettings` 和 `XmlSerializerNamespaces` 实现高级控制[^1]: ```csharp void AdvancedSerialize(object obj, string path) { var settings = new XmlWriterSettings { Indent = true, Encoding = Encoding.UTF8, IndentChars = " ", OmitXmlDeclaration = true // 隐藏 XML 声明头 }; var namespaces = new XmlSerializerNamespaces(); namespaces.Add("", ""); // 清除默认命名空间 using (var writer = XmlWriter.Create(path, settings)) { new XmlSerializer(obj.GetType()).Serialize(writer, obj, namespaces); } } ``` #### 三、异常处理要点 1. **空值检查** ```csharp if (obj == null) throw new ArgumentNullException("obj"); ``` 2. **型有效性验证** 当型包含无法序化的成员(如私有字段)时,会抛出 `InvalidOperationException` 3. **文件访问异常** 需处理 `IOException` 和 `UnauthorizedAccessException` #### 四、复杂型处理 对于包含循环引用的型,需使用化回调方法[^3]: ```csharp public class Department { [XmlIgnore] // 避免循环引用导致的死循环 public Employee Manager { get; set; } [OnSerializing] private void BeforeSerializing(StreamingContext context) { // 序化前预处理逻辑 } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunjay117

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值