.NET对象的XML序列化和反序列化

本文介绍了.NET Framework中XML序列化的基本概念和技术,包括使用XmlSerializer类将对象转换为XML格式的方法,以及如何通过自定义特性来控制序列化过程。文中还提供了一个人力资源信息类的序列化示例。
 
概述
.NET Framework 为处理 XML 数据提供了许多不同的类库。 XmlDocument 类能让你像处理文件一样处理 xml 数据,而 XmlReader XmlWriter 和它们的派生类使你能够将 xml 数据作为数据流处理。
XmlSerializer 则提供了另外的方法,它使你能够将自己的对象串行化和反串行化为 xml 。串行化数据既能够让你像处理文件一样对数据进行随机处理,同时又能跳过你不感兴趣的数据。
主要类库介绍
   .NET 支持对象 xml 序列化和反序列化的类库主要位于命名空间 System.Xml.Serialization 中。
   1.  XmlSerializer
   该类用一种高度松散耦合的方式提供串行化服务。你的类不需要继承特别的基类,而且它们也不需要实现特别的接口。相反,你只需在你的类或者这些类的公共域以及读 / 写属性里加上自定义的特性。 XmlSerializer 通过反射机制读取这些特性并用它们将你的类和类成员映射到 xml 元素和属性。
   2. XmlAttributeAttribute
   指定类的公共域或读 / 写属性对应 xml 文件的 Attribute
   例: [XmlAttribute(“type”)] or [XmlAttribute(AttributeName=”type”)]
   3. XmlElementAttribute
   指定类的公共域或读 / 写属性对应 xml 文件的 Element
   例: [XmlElement(“Maufacturer”)] or [XmlElement(ElementName=”Manufacturer”)]
   4. XmlRootAttribute
   Xml 序列化时,由该特性指定的元素将被序列化成 xml 的根元素。
   例: [XmlRoot(“RootElement”)] or [XmlRoot(ElementName = “RootElements”)]
   5. XmlTextAttribute
   Xml 序列化时,由该特性指定的元素值将被序列化成 xml 元素的值。一个类只允许拥有一个该特性类的实例,因为 xml 元素只能有一个值。
   6. XmlIgnoreAttribute
   Xml 序列化时不会序列化该特性指定的元素。
实例
   下面例子中的 xml schema 描述了一个简单的人力资源信息,其中包含了 xml 的大部分格式,如 xml 元素相互嵌套, xml 元素既有元素值,又有属性值。
  
   1. 待序列化的类层次结构
    [XmlRoot("humanResource")]
    public class HumanResource
    {
        #region private data.
        private int m_record = 0;
        private Worker[] m_workers = null;
        #endregion
 
        [XmlAttribute(AttributeName="record")]
        public int Record
        {
            get { return m_record; }
            set { m_record = value; }
        }
 
        [XmlElement(ElementName="worker")]
        public Worker[] Workers
        {
            get { return m_workers; }
            set { m_workers = value; }
        }
}
 
    public class Worker
    {
        #region private data.
        private string m_number = null;
        private InformationItem[] m_infoItems = null;
        #endregion
 
        [XmlAttribute("number")]
        public string Number
        {
            get { return m_number; }
            set { m_number = value; }
        }
 
        [XmlElement("infoItem")]
        public InformationItem[] InfoItems
        {
            get { return m_infoItems; }
            set { m_infoItems = value; }
        }
}
 
    public class InformationItem
    {
        #region private data.
        private string m_name = null;
        private string m_value = null;
        #endregion
 
        [XmlAttribute(AttributeName = "name")]
        public string Name
        {
            get { return m_name; }
            set { m_name = value; }
        }
 
        [XmlText]
        public string Value
        {
            get { return m_value; }
            set { m_value = value; }
        }
}
   2. 序列化生成的 xml 结构
        <?xml version="1.0" ?>
- <humanResource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" record="2">
- <worker number="001">
                 <infoItem name="name">Michale</infoItem>
                 <infoItem name="sex">male</infoItem>
                 <infoItem name="age">25</infoItem>
            </worker>
- <worker number="002">
                 <infoItem name="name">Surce</infoItem>
                 <infoItem name="sex">male</infoItem>
                 <infoItem name="age">28</infoItem>
           </worker>
         </humanResource>
   3. 利用 XmlSerializer 类进行序列化和反序列化的实现(一般利用缓存机制实现 xml 文件只解析一次。)
    public sealed class ConfigurationManager
    {
        private static HumanResource m_humanResource = null;
        private ConfigurationManager(){}
 
        public static HumanResource Get(string path)
        {
            if (m_humanResource == null)
            {
                FileStream fs = null;
                try
                {
                    XmlSerializer xs = new XmlSerializer(typeof(HumanResource));
                    fs = new FileStream(path, FileMode.Open, FileAccess.Read);
                    m_humanResource = (HumanResource)xs.Deserialize(fs);
                    fs.Close();
                    return m_humanResource;
                }
                catch
                {
                    if (fs != null)
                        fs.Close();
                    throw new Exception("Xml deserialization failed!");
                }
 
            }
            else
            {
                return m_humanResource;
            }
        }
 
        public static void Set(string path, HumanResource humanResource)
        {
            if (humanResource == null)
                throw new Exception("Parameter humanResource is null!");
           
            FileStream fs = null;
            try
            {
                XmlSerializer xs = new XmlSerializer(typeof(HumanResource));
                fs = new FileStream(path, FileMode.Create, FileAccess.Write);
                xs.Serialize(fs, humanResource);
                m_humanResource = null;
                fs.Close();
            }
            catch
            {
                if (fs != null)
                    fs.Close();
                throw new Exception("Xml serialization failed!");
            }
        }
    }
说明
   1. 需要序列化为 xml 元素的属性必须为读 / 写属性;
   2. 注意为类成员设定缺省值,尽管这并不是必须的。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值