您的位置:首页 > 其它

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

2007-05-15 22:14 579 查看
一概述
.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. 待序列化的类层次结构
[align=left] [XmlRoot("humanResource")][/align]
[align=left] public class HumanResource[/align]
[align=left] {[/align]
[align=left] #region private data.[/align]
[align=left] private int m_record = 0;[/align]
[align=left] private Worker[] m_workers = null;[/align]
[align=left] #endregion[/align]
[align=left] [/align]
[align=left] [XmlAttribute(AttributeName="record")][/align]
[align=left] public int Record[/align]
[align=left] {[/align]
[align=left] get { return m_record; }[/align]
[align=left] set { m_record = value; }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [XmlElement(ElementName="worker")][/align]
[align=left] public Worker[] Workers[/align]
[align=left] {[/align]
[align=left] get { return m_workers; }[/align]
[align=left] set { m_workers = value; }[/align]
[align=left] }[/align]
}

[align=left] public class Worker[/align]
[align=left] {[/align]
[align=left] #region private data.[/align]
[align=left] private string m_number = null;[/align]
[align=left] private InformationItem[] m_infoItems = null;[/align]
[align=left] #endregion[/align]
[align=left] [/align]
[align=left] [XmlAttribute("number")][/align]
[align=left] public string Number[/align]
[align=left] {[/align]
[align=left] get { return m_number; }[/align]
[align=left] set { m_number = value; }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [XmlElement("infoItem")][/align]
[align=left] public InformationItem[] InfoItems[/align]
[align=left] {[/align]
[align=left] get { return m_infoItems; }[/align]
[align=left] set { m_infoItems = value; }[/align]
[align=left] }[/align]
}

[align=left] public class InformationItem[/align]
[align=left] {[/align]
[align=left] #region private data.[/align]
[align=left] private string m_name = null;[/align]
[align=left] private string m_value = null;[/align]
[align=left] #endregion[/align]
[align=left] [/align]
[align=left] [XmlAttribute(AttributeName = "name")][/align]
[align=left] public string Name[/align]
[align=left] {[/align]
[align=left] get { return m_name; }[/align]
[align=left] set { m_name = value; }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [XmlText][/align]
[align=left] public string Value[/align]
[align=left] {[/align]
[align=left] get { return m_value; }[/align]
[align=left] set { m_value = value; }[/align]
[align=left] }[/align]
}
2. 序列化生成的xml结构
<?xml version="1.0" ?>
[align=left]- <humanResource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" record="2">[/align]
[align=left]- <worker number="001">[/align]
[align=left] <infoItem name="name">Michale</infoItem> [/align]
[align=left] <infoItem name="sex">male</infoItem> [/align]
[align=left] <infoItem name="age">25</infoItem> [/align]
[align=left] </worker>[/align]
[align=left]- <worker number="002">[/align]
[align=left] <infoItem name="name">Surce</infoItem> [/align]
[align=left] <infoItem name="sex">male</infoItem> [/align]
[align=left] <infoItem name="age">28</infoItem> [/align]
[align=left] </worker>[/align]
[align=left] </humanResource>[/align]
3. 利用XmlSerializer类进行序列化和反序列化的实现(一般利用缓存机制实现xml文件只解析一次。)
[align=left] public sealed class ConfigurationManager[/align]
[align=left] {[/align]
[align=left] private static HumanResource m_humanResource = null;[/align]
[align=left] private ConfigurationManager(){}[/align]
[align=left] [/align]
[align=left] public static HumanResource Get(string path)[/align]
[align=left] {[/align]
[align=left] if (m_humanResource == null)[/align]
[align=left] {[/align]
[align=left] FileStream fs = null;[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] XmlSerializer xs = new XmlSerializer(typeof(HumanResource));[/align]
[align=left] fs = new FileStream(path, FileMode.Open, FileAccess.Read);[/align]
[align=left] m_humanResource = (HumanResource)xs.Deserialize(fs);[/align]
[align=left] fs.Close();[/align]
[align=left] return m_humanResource;[/align]
[align=left] }[/align]
[align=left] catch[/align]
[align=left] {[/align]
[align=left] if (fs != null)[/align]
[align=left] fs.Close();[/align]
[align=left] throw new Exception("Xml deserialization failed!");[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] else[/align]
[align=left] {[/align]
[align=left] return m_humanResource;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] public static void Set(string path, HumanResource humanResource)[/align]
[align=left] {[/align]
[align=left] if (humanResource == null)[/align]
[align=left] throw new Exception("Parameter humanResource is null!");[/align]
[align=left] [/align]
[align=left] FileStream fs = null;[/align]
[align=left] try[/align]
[align=left] {[/align]
[align=left] XmlSerializer xs = new XmlSerializer(typeof(HumanResource));[/align]
[align=left] fs = new FileStream(path, FileMode.Create, FileAccess.Write);[/align]
[align=left] xs.Serialize(fs, humanResource);[/align]
[align=left] m_humanResource = null;[/align]
[align=left] fs.Close();[/align]
[align=left] }[/align]
[align=left] catch[/align]
[align=left] {[/align]
[align=left] if (fs != null)[/align]
[align=left] fs.Close();[/align]
[align=left] throw new Exception("Xml serialization failed!");[/align]
[align=left] }[/align]
[align=left] }[/align]
}
四说明
1. 需要序列化为xml元素的属性必须为读/写属性;
2. 注意为类成员设定缺省值,尽管这并不是必须的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: