在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了。 序列化概念的提出和实现,可以使我们的应用程序的设置信息保存和读取更加方便。 序列化有很多好处,比如,在一台机器上产生一个实例,初始化完毕,然后可以序列化,通过网络传送到另一台机器,然后反序列化,得到对象实例,之后再执行某些业务逻辑,得到结果,再序列化,返回第一台机器,第一台机器得到对象实例,得到结果。 当前比较热火的web services使用soap协议,soap协议也是以对象的可序列化为基础的。 一 概述
.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. 注意为类成员设定缺省值,尽管这并不是必须的。
“序列化”可被定义为将对象的状态存储到存储媒介中的过程。在此过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流。在以后“反序列化”该对象时,创建原始对象的精确复本。 public MEABlock()
要实现上述类的实例的序列化,可参照如下例子:
XML 序列化仅将对象的公共字段和属性值序列化为 XML 流。XML 序列化不包括类型信息。例如,如果您有一个存在于 Library 命名空间中的 Book 对象,将不能保证它将会被反序列化为同一类型的对象。 注意 XML 序列化不转换方法、索引器、私有字段或只读属性(只读集合除外)。若要序列化对象的所有字段和属性(公共的和私有的),请使用BinaryFormatter,而不要使用 XML 序列化。 XML 序列化中最主要的类是 XmlSerializer 类,它的最重要的方法是 Serialize 和 Deserialize 方法。XmlSerializer 生成的 XML 流符合万维网联合会 (www.w3.org) XML 架构定义语言 (XSD) 1.0 的建议。另外,生成的数据类型符合标题为“XML Schema Part 2: Datatypes”(XML 架构第二部分:数据类型)的文档。 对象中的数据是用编程语言构造(如类、字段、属性、基元类型、数组,甚至 XmlElement 或 XmlAttribute 对象形式的嵌入 XML)来描述的。您可以创建自己的用属性批注的类,或者使用 XML 架构定义工具生成基于现有 XML 架构的类。 如果您有 XML 架构,就可运行 XML 架构定义工具生成一组强类型化为架构并用属性批注的类。当序列化这样的类的实例时,生成的 XML 符合 XML 架构。使用这样的类,就可针对容易操作的对象模型进行编程,同时确保生成的 XML 符合 XML 架构。这是使用 .NET Framework 中的其他类(如 XmlReader 和 XmlWriter 类)分析和写 XML 流的一种替换方法。(有关使用这些类的更多信息,请参见使用 .NET Framework 中的 XML。)这些类使您可以分析任何 XML 流。与此相反,当需要 XML 流符合已知的 XML 架构时,请使用 XmlSerializer。 属性控制由 XmlSerializer 类生成的 XML 流,使您可以设置 XML 流的 XML 命名空间、元素名、属性名等。有关这些属性和它们如何控制 XML 序列化的更多信息,请参见使用属性控制 XML 序列化。若想获得一个列示对所生成的 XML 起控制作用的那些属性的表,请参见控制 XML 序列化的属性。 XmlSerializer 类可进一步序列化对象并生成编码的 SOAP XML 流。生成的 XML 符合标题为“Simple Object Access Protocol (SOAP) 1.1”的万维网联合会文档的第 5 节。有关此过程的更多信息,请参见用 XML 序列化生成 SOAP 消息。有关控制生成的 XML 的属性表,请参见控制编码的 SOAP 序列化的属性。 XmlSerializer 类生成由 XML Web services 创建和传递给 XML Web services 的 SOAP 消息。若要控制 SOAP 消息,可将属性应用于 XML Web services 文件 (.asmx) 中的类、返回值、参数和字段。您可以同时使用在“控制 XML 序列化的属性”中列出的属性和在“控制编码的 SOAP 序列化的属性”中列出的属性,因为 XML Web services 可以使用文本样式,也可以使用编码的 SOAP 样式。有关使用属性控制 XML Web services 所生成的 XML 的更多信息,请参见 XML Web services 的 XML 序列化。有关 SOAP 和 XML Web services 的更多信息,请参见自定义 SOAP 消息。 保护 XmlSerializer 应用程序在创建使用 XmlSerializer 的应用程序时,您应当了解以下几点以及它们的影响:
简单类的序列化下面的示例显示一个具有公共字段的简单类: [Visual Basic]Public Class OrderForm Public OrderDate As DateTimeEnd Class[C#]public class OrderForm{ public DateTime OrderDate;} 当将此类的实例序列化时,该实例可能类似于下面的代码: <OrderForm> <OrderDate>12/12/01</OrderDate></OrderForm> 有关序列化的更多示例,请参见 XML 序列化的示例。 可以序列化的项使用 XmLSerializer 类,可将下列项序列化。
序列化和反序列化对象若要序列化对象,首先创建要序列化的对象并设置它的公共属性和字段。为此,必须确定要用以存储 XML 流的传输格式(或者作为流,或者作为文件)。例如,如果 XML 流必须以永久形式保存,则创建 FileStream 对象。当您反序列化对象时,传输格式确定您将创建流还是文件对象。确定了传输格式之后,就可以根据需要调用 Serialize 或Deserialize 方法。 序列化对象
反序列化对象
有关 XML 序列化的更多示例,请参见 XML 序列化的示例。 使用 XML 序列化的好处XmlSerializer 类在您将对象序列化为 XML 时为您提供完整而灵活的控制。如果您正在创建 XML Web services,则可以将控制序列化的属性应用于类和成员以确保 XML 输出符合特定的架构。 例如,XmlSerializer 使您能够:
XML 序列化的另一个好处是:只要生成的 XML 流符合给定的架构,则对于所开发的应用程序就没有约束。假定有这样一个用于描述图书的架构,它具有标题、作者、出版商和 ISBN 编号元素。您可以开发一个以您希望的任何方式(例如,作为图书订单,或作为图书清单)处理 XML 数据的应用程序。在任一种情况下,唯一的要求是 XML 流应当符合指定的 XML 架构定义语言 (XSD) 架构。 XML 序列化注意事项使用 XmlSerializer 类时,应考虑下列情况:
XSD 数据类型映射标题为“XML Schema Part 2: Datatypes”的万维网联合会 (www.W3.org) 文档指定在 XML 架构定义语言 (XSD) 架构中允许使用的简单数据类型。对于这些数据类型中的许多类型(例如,int 和 decimal),在 .NET Framework 中都有对应的数据类型。但是,某些 XML 数据类型在 .NET Framework 中没有对应的数据类型(例如,NMTOKEN数据类型)。在这样的情况下,如果使用 XML 架构定义工具 (Xsd.exe) 从架构生成类,就会将适当的特性应用于字符串类型的成员,并会将其 DataType 属性设置为 XML 数据类型名称。例如,如果架构包含一个数据类型为 XML 数据类型 NMTOKEN 的、名为“MyToken”的元素,则生成的类可能包含以下示例中的成员。 [Visual Basic]<XmlElement(DataType:="NMTOKEN")>Public MyToken As String[C#][XmlElement(DataType = "NMTOKEN")]public string MyToken; 与此类似,如果创建一个必须符合特定 XML 架构 (XSD) 的类,应当应用适当的特性并将它的 DataType 属性设置为所需的 XML 数据类型名称。 有关类型映射的完整列表,请参见下列任意一个特性类的 DataType 属性:SoapAttributeAttribute、SoapElementAttribute、XmlArrayItemAttribute、XmlAttributeAttribute、XmlElementAttribute 或 XmlRootAttribute。 序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了。 序列化概念的提出和实现,可以使我们的应用程序的设置信息保存和读取更加方便。 序列化有很多好处,比如,在一台机器上产生一个实例,初始化完毕,然后可以序列化,通过网络传送到另一台机器,然后反序列化,得到对象实例,之后再执行某些业务逻辑,得到结果,再序列化,返回第一台机器,第一台机器得到对象实例,得到结果。 当前比较热火的web services使用soap协议,soap协议也是以对象的可序列化为基础的。 一 概述
.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. 注意为类成员设定缺省值,尽管这并不是必须的。
“序列化”可被定义为将对象的状态存储到存储媒介中的过程。在此过程中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,然后写入数据流。在以后“反序列化”该对象时,创建原始对象的精确复本。 public MEABlock()
要实现上述类的实例的序列化,可参照如下例子:
XML 序列化仅将对象的公共字段和属性值序列化为 XML 流。XML 序列化不包括类型信息。例如,如果您有一个存在于 Library 命名空间中的 Book 对象,将不能保证它将会被反序列化为同一类型的对象。 注意 XML 序列化不转换方法、索引器、私有字段或只读属性(只读集合除外)。若要序列化对象的所有字段和属性(公共的和私有的),请使用BinaryFormatter,而不要使用 XML 序列化。 XML 序列化中最主要的类是 XmlSerializer 类,它的最重要的方法是 Serialize 和 Deserialize 方法。XmlSerializer 生成的 XML 流符合万维网联合会 (www.w3.org) XML 架构定义语言 (XSD) 1.0 的建议。另外,生成的数据类型符合标题为“XML Schema Part 2: Datatypes”(XML 架构第二部分:数据类型)的文档。 对象中的数据是用编程语言构造(如类、字段、属性、基元类型、数组,甚至 XmlElement 或 XmlAttribute 对象形式的嵌入 XML)来描述的。您可以创建自己的用属性批注的类,或者使用 XML 架构定义工具生成基于现有 XML 架构的类。 如果您有 XML 架构,就可运行 XML 架构定义工具生成一组强类型化为架构并用属性批注的类。当序列化这样的类的实例时,生成的 XML 符合 XML 架构。使用这样的类,就可针对容易操作的对象模型进行编程,同时确保生成的 XML 符合 XML 架构。这是使用 .NET Framework 中的其他类(如 XmlReader 和 XmlWriter 类)分析和写 XML 流的一种替换方法。(有关使用这些类的更多信息,请参见使用 .NET Framework 中的 XML。)这些类使您可以分析任何 XML 流。与此相反,当需要 XML 流符合已知的 XML 架构时,请使用 XmlSerializer。 属性控制由 XmlSerializer 类生成的 XML 流,使您可以设置 XML 流的 XML 命名空间、元素名、属性名等。有关这些属性和它们如何控制 XML 序列化的更多信息,请参见使用属性控制 XML 序列化。若想获得一个列示对所生成的 XML 起控制作用的那些属性的表,请参见控制 XML 序列化的属性。 XmlSerializer 类可进一步序列化对象并生成编码的 SOAP XML 流。生成的 XML 符合标题为“Simple Object Access Protocol (SOAP) 1.1”的万维网联合会文档的第 5 节。有关此过程的更多信息,请参见用 XML 序列化生成 SOAP 消息。有关控制生成的 XML 的属性表,请参见控制编码的 SOAP 序列化的属性。 XmlSerializer 类生成由 XML Web services 创建和传递给 XML Web services 的 SOAP 消息。若要控制 SOAP 消息,可将属性应用于 XML Web services 文件 (.asmx) 中的类、返回值、参数和字段。您可以同时使用在“控制 XML 序列化的属性”中列出的属性和在“控制编码的 SOAP 序列化的属性”中列出的属性,因为 XML Web services 可以使用文本样式,也可以使用编码的 SOAP 样式。有关使用属性控制 XML Web services 所生成的 XML 的更多信息,请参见 XML Web services 的 XML 序列化。有关 SOAP 和 XML Web services 的更多信息,请参见自定义 SOAP 消息。 保护 XmlSerializer 应用程序在创建使用 XmlSerializer 的应用程序时,您应当了解以下几点以及它们的影响:
简单类的序列化下面的示例显示一个具有公共字段的简单类: [Visual Basic]Public Class OrderForm Public OrderDate As DateTimeEnd Class[C#]public class OrderForm{ public DateTime OrderDate;} 当将此类的实例序列化时,该实例可能类似于下面的代码: <OrderF |
请发表评论