NET对象的XML序列化和反序列化(一)
2008-08-22 14:54
459 查看
一 概述
.NET Framework为处理XML[/b]数据提供了许多不同的类库。XmlDocument类能让你像处理文件一样处理xml[/b]数据,而XmlReader、XmlWriter和它们的派生类使你能够将xml[/b]数据作为数据流处理。
XmlSerializer则提供了另外的方法,它使你能够将自己的对象串行化和反串行化为xml[/b]。串行化数据既能够让你像处理文件一样对数据进行随机处理,同时又能跳过你不感兴趣的数据。
二 主要类库介绍
.NET 支持对象xml[/b]序列化和反序列化的类库主要位于命名空间System.Xml[/b].Serialization中。
1. XmlSerializer 类
该类用一种高度松散耦合的方式提供串行化服务。你的类不需要继承特别的基类,而且它们也不需要实现特别的接口。相反,你只需在你的类或者这些类的公共域以及读/写属性里加上自定义的特性[/b]。XmlSerializer通过反射机制读取这些特性[/b]并用它们将你的类和类成员映射到xml[/b]元素和属性。
2. XmlAttributeAttribute 类
指定类的公共域或读/写属性对应xml[/b]文件的Attribute。
例:[XmlAttribute(“type”)] or [XmlAttribute(AttributeName=”type”)]
3. XmlElementAttribute类
指定类的公共域或读/写属性对应xml[/b]文件的Element。
例:[XmlElement(“Maufacturer”)] or [XmlElement(ElementName=”Manufacturer”)]
4. XmlRootAttribute类
Xml[/b]序列化时,由该特性[/b]指定的元素将被序列化成xml[/b]的根元素。
例:[XmlRoot(“RootElement”)] or [XmlRoot(ElementName = “RootElements”)]
5. XmlTextAttribute 类
Xml[/b]序列化时,由该特性[/b]指定的元素值将被序列化成xml[/b]元素的值。一个类只允许拥有一个该特性[/b]类的实例,因为xml[/b]元素只能有一个值。
6. XmlIgnoreAttribute类
Xml[/b]序列化时不会序列化该特性[/b]指定的元素。
三 实例
下面例子中的xml[/b] schema 描述了一个简单的人力资源信息,其中包含了xml[/b]的大部分格式,如xml[/b] 元素相互嵌套, xml[/b]元素既有元素值,又有属性值。
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[/b]结构
<?xml[/b] 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[/b]文件只解析一次。)
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[/b] 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[/b] serialization failed!");
}
}
}
四 说明
1. 需要序列化为xml[/b]元素的属性必须为读/写属性;
2. 注意为类成员设定缺省值,尽管这并不是必须的。
.NET Framework为处理XML[/b]数据提供了许多不同的类库。XmlDocument类能让你像处理文件一样处理xml[/b]数据,而XmlReader、XmlWriter和它们的派生类使你能够将xml[/b]数据作为数据流处理。
XmlSerializer则提供了另外的方法,它使你能够将自己的对象串行化和反串行化为xml[/b]。串行化数据既能够让你像处理文件一样对数据进行随机处理,同时又能跳过你不感兴趣的数据。
二 主要类库介绍
.NET 支持对象xml[/b]序列化和反序列化的类库主要位于命名空间System.Xml[/b].Serialization中。
1. XmlSerializer 类
该类用一种高度松散耦合的方式提供串行化服务。你的类不需要继承特别的基类,而且它们也不需要实现特别的接口。相反,你只需在你的类或者这些类的公共域以及读/写属性里加上自定义的特性[/b]。XmlSerializer通过反射机制读取这些特性[/b]并用它们将你的类和类成员映射到xml[/b]元素和属性。
2. XmlAttributeAttribute 类
指定类的公共域或读/写属性对应xml[/b]文件的Attribute。
例:[XmlAttribute(“type”)] or [XmlAttribute(AttributeName=”type”)]
3. XmlElementAttribute类
指定类的公共域或读/写属性对应xml[/b]文件的Element。
例:[XmlElement(“Maufacturer”)] or [XmlElement(ElementName=”Manufacturer”)]
4. XmlRootAttribute类
Xml[/b]序列化时,由该特性[/b]指定的元素将被序列化成xml[/b]的根元素。
例:[XmlRoot(“RootElement”)] or [XmlRoot(ElementName = “RootElements”)]
5. XmlTextAttribute 类
Xml[/b]序列化时,由该特性[/b]指定的元素值将被序列化成xml[/b]元素的值。一个类只允许拥有一个该特性[/b]类的实例,因为xml[/b]元素只能有一个值。
6. XmlIgnoreAttribute类
Xml[/b]序列化时不会序列化该特性[/b]指定的元素。
三 实例
下面例子中的xml[/b] schema 描述了一个简单的人力资源信息,其中包含了xml[/b]的大部分格式,如xml[/b] 元素相互嵌套, xml[/b]元素既有元素值,又有属性值。
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[/b]结构
<?xml[/b] 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[/b]文件只解析一次。)
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[/b] 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[/b] serialization failed!");
}
}
}
四 说明
1. 需要序列化为xml[/b]元素的属性必须为读/写属性;
2. 注意为类成员设定缺省值,尽管这并不是必须的。
相关文章推荐
- .NET对象的XML序列化和反序列化
- (转).NET对象的XML序列化和反序列化
- NET对象的XML序列化和反序列化
- (转) .NET对象的XML序列化和反序列化
- 用 XStream 序列化/反序列化 XML 为 Java 对象(实例)
- XmlSerializer 对象的Xml序列化和反序列化
- XmlSerializer 对象的Xml序列化和反序列化
- 对象的xml序列化、反序列化
- xml序列化及反序列化.net对象
- ASP.NET:使用Newtonsoft.Json序列化和反序列化JSON对象的例子
- (Tips)Java对象的XML序列化和反序列化 - (1)
- XmlSerializer 对象的Xml序列化和反序列化
- XmlSerializer 对象的Xml序列化和反序列化
- 一个经过改良的XMLHelper(包含了序列化,反序列化,创建xml文件,读取节点,C#对象与xml文件的相互转换等等。)
- Xml序列化和反序列化对象-使用MemoryStream-实践
- 对象的序列化与反序列化,以xml,二进制流的方式,soap方式序列化对象
- XmlSerializer 对象的Xml序列化和反序列化
- XmlSerializer 对象的Xml序列化和反序列化
- .NET对象的XML序列化和反序列化
- 对象序列化反序列化为xml