C#学习之XML中序列化对象
2014-05-04 22:51
489 查看
序列化是把一个对象持久化到磁盘中的过程。应用程序的另一部分,甚至另一个引用程序都可以反序列化对象,使它的状态与序列化之前相同。
序列化使用的是System.Xml.Serialization名称空间中最重要的XmlSerializer类,要序列化对象,首先需要实例化一个XmlSerializer对象,指定要序列化的对象类型,然后实例化一个流/写入器对象,一把文件写入流/文档中。最后一步实在Xmlserializer上调用Serializer()方法,给它传递流/写入器对象和要序列化的对象。
被序列化的数据可以为基元类型的数据、字段、数组,以及XmlElement和XmlAttribute对象格式的内嵌XML。
为了从XML文档中反序列化对象,应执行上述过程的逆过程。即创建一个流/读取器对象和一个XmlSerializer对象,然后给DeSerializer()方法传递该流/读取器对象。这个方法返回反序列化的对象,尽管它需要强制转换为正确的类型。
注意:XML序列化程序不能转换私有数据,只能转换公有数据,它也不能序列化对象图表。但是,这并不是一个严格的限制。对类进行仔细的涉及,就很容易避免这个问题,如果需要序列化公共数据和私有数据,以及包含许多潜逃对象的对象图形,就可以使用System.Runtime.SerializationFormatters.Binary名称空间。
现在就写一些示例代码看一下XML如何序列化和反序列化。
首先需要创建一个类,里面包含一些私有数据和一些公共数据。
Product.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
namespace GenerateXML
{
[System.Xml.Serialization.XmlRootAttribute()]
public class Product
{
private int prodId;
private string prodName;
private int suppId;
private int catId;
private string qtyPerUnit;
private Decimal unitPrice;
private short unitsInStock;
private short unitsOnOrder;
private short reorderLvl;
private bool discont;
private int disc;
//added the Discount attribute
[XmlAttributeAttribute(AttributeName = "Discount")]
public int Discount
{
get { return disc; }
set { disc = value; }
}
[XmlElementAttribute()]
public int ProductID
{
get { return prodId; }
set { prodId = value; }
}
[XmlElementAttribute()]
public string ProductName
{
get { return prodName; }
set { prodName = value; }
}
[XmlElementAttribute()]
public int SupplierID
{
get { return suppId; }
set { suppId = value; }
}
[XmlElementAttribute()]
public int CategoryID
{
get { return catId; }
set { catId = value; }
}
[XmlElementAttribute()]
public string QuantityPerUnit
{
get { return qtyPerUnit; }
set { qtyPerUnit = value; }
}
[XmlElementAttribute()]
public Decimal UnitPrice
{
get { return unitPrice; }
set { unitPrice = value; }
}
[XmlElementAttribute()]
public short UnitsInStock
{
get { return unitsInStock; }
set { unitsInStock = value; }
}
[XmlElementAttribute()]
public short UnitsOnOrder
{
get { return unitsOnOrder; }
set { unitsOnOrder = value; }
}
[XmlElementAttribute()]
public short ReorderLevel
{
get { return reorderLvl; }
set { reorderLvl = value; }
}
[XmlElementAttribute()]
public bool Discontinued
{
get { return discont; }
set { discont = value; }
}
public override string ToString()
{
StringBuilder outText = new StringBuilder();
outText.Append(prodId);
outText.Append(" ");
outText.Append(prodName);
outText.Append(" ");
outText.Append(unitPrice);
return outText.ToString();
}
}
}
在Product类定义上面的特性中调用的XmlRootAttribute()方法把这个类表示为根元素。包含XmlElementAttribute()方法的特性标识该特性下面的成员表示一个XML元素。在刚开始序列化应用的时候,要注意Class前面的public字段一定要加上,否则会出现“因其保护级别而不可访问。只能处理公共类型。”的错误。
其次需要的是序列化的方法
public string Serializer(Type type, object obj)
{
MemoryStream Stream = new MemoryStream();
XmlSerializer xml = new XmlSerializer(type);
try
{
//序列化对象
xml.Serialize(Stream, obj);
}
catch (InvalidOperationException)
{
throw;
}
Stream.Position = 0;
StreamReader sr = new StreamReader(Stream);
string str = sr.ReadToEnd();
sr.Dispose();
Stream.Dispose();
return str;
}
这里主要是以流的方式进行序列化。其中tyoe就是product实例化后用GetType()方法获得的type,object则是实例化的product。这样就可以返回序列化后的字符串样式。
<?xml version="1.0"?>
<Product xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Discount="0">
<ProductID>200</ProductID>
<ProductName>Serialize Objects</ProductName>
<SupplierID>1</SupplierID>
<CategoryID>100</CategoryID>
<QuantityPerUnit>6</QuantityPerUnit>
<UnitPrice>1000</UnitPrice>
<UnitsInStock>10</UnitsInStock>
<UnitsOnOrder>0</UnitsOnOrder>
<ReorderLevel>1</ReorderLevel>
<Discontinued>false</Discontinued>
</Product>
我们在这里可以看到Discount作为XmlAttributeAttribute()时,它是根节点的一个属性。而其余的都是XML元素。
对于反序列化,则相对比较简单,其方法大致如下:
public object Deserialize(Type type, Stream stream)
{
XmlSerializer xmldes = new XmlSerializer(type);
return xmldes.Deserialize(stream);
}
这里的stream就是这个Product类对应的Xml,type就是product类实例化后用GetType()方法获得的type,这样就可以得到一个反序列化后的object,最后通过强制转换可以还原成一个Product。
序列化使用的是System.Xml.Serialization名称空间中最重要的XmlSerializer类,要序列化对象,首先需要实例化一个XmlSerializer对象,指定要序列化的对象类型,然后实例化一个流/写入器对象,一把文件写入流/文档中。最后一步实在Xmlserializer上调用Serializer()方法,给它传递流/写入器对象和要序列化的对象。
被序列化的数据可以为基元类型的数据、字段、数组,以及XmlElement和XmlAttribute对象格式的内嵌XML。
为了从XML文档中反序列化对象,应执行上述过程的逆过程。即创建一个流/读取器对象和一个XmlSerializer对象,然后给DeSerializer()方法传递该流/读取器对象。这个方法返回反序列化的对象,尽管它需要强制转换为正确的类型。
注意:XML序列化程序不能转换私有数据,只能转换公有数据,它也不能序列化对象图表。但是,这并不是一个严格的限制。对类进行仔细的涉及,就很容易避免这个问题,如果需要序列化公共数据和私有数据,以及包含许多潜逃对象的对象图形,就可以使用System.Runtime.SerializationFormatters.Binary名称空间。
现在就写一些示例代码看一下XML如何序列化和反序列化。
首先需要创建一个类,里面包含一些私有数据和一些公共数据。
Product.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
namespace GenerateXML
{
[System.Xml.Serialization.XmlRootAttribute()]
public class Product
{
private int prodId;
private string prodName;
private int suppId;
private int catId;
private string qtyPerUnit;
private Decimal unitPrice;
private short unitsInStock;
private short unitsOnOrder;
private short reorderLvl;
private bool discont;
private int disc;
//added the Discount attribute
[XmlAttributeAttribute(AttributeName = "Discount")]
public int Discount
{
get { return disc; }
set { disc = value; }
}
[XmlElementAttribute()]
public int ProductID
{
get { return prodId; }
set { prodId = value; }
}
[XmlElementAttribute()]
public string ProductName
{
get { return prodName; }
set { prodName = value; }
}
[XmlElementAttribute()]
public int SupplierID
{
get { return suppId; }
set { suppId = value; }
}
[XmlElementAttribute()]
public int CategoryID
{
get { return catId; }
set { catId = value; }
}
[XmlElementAttribute()]
public string QuantityPerUnit
{
get { return qtyPerUnit; }
set { qtyPerUnit = value; }
}
[XmlElementAttribute()]
public Decimal UnitPrice
{
get { return unitPrice; }
set { unitPrice = value; }
}
[XmlElementAttribute()]
public short UnitsInStock
{
get { return unitsInStock; }
set { unitsInStock = value; }
}
[XmlElementAttribute()]
public short UnitsOnOrder
{
get { return unitsOnOrder; }
set { unitsOnOrder = value; }
}
[XmlElementAttribute()]
public short ReorderLevel
{
get { return reorderLvl; }
set { reorderLvl = value; }
}
[XmlElementAttribute()]
public bool Discontinued
{
get { return discont; }
set { discont = value; }
}
public override string ToString()
{
StringBuilder outText = new StringBuilder();
outText.Append(prodId);
outText.Append(" ");
outText.Append(prodName);
outText.Append(" ");
outText.Append(unitPrice);
return outText.ToString();
}
}
}
在Product类定义上面的特性中调用的XmlRootAttribute()方法把这个类表示为根元素。包含XmlElementAttribute()方法的特性标识该特性下面的成员表示一个XML元素。在刚开始序列化应用的时候,要注意Class前面的public字段一定要加上,否则会出现“因其保护级别而不可访问。只能处理公共类型。”的错误。
其次需要的是序列化的方法
public string Serializer(Type type, object obj)
{
MemoryStream Stream = new MemoryStream();
XmlSerializer xml = new XmlSerializer(type);
try
{
//序列化对象
xml.Serialize(Stream, obj);
}
catch (InvalidOperationException)
{
throw;
}
Stream.Position = 0;
StreamReader sr = new StreamReader(Stream);
string str = sr.ReadToEnd();
sr.Dispose();
Stream.Dispose();
return str;
}
这里主要是以流的方式进行序列化。其中tyoe就是product实例化后用GetType()方法获得的type,object则是实例化的product。这样就可以返回序列化后的字符串样式。
<?xml version="1.0"?>
<Product xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Discount="0">
<ProductID>200</ProductID>
<ProductName>Serialize Objects</ProductName>
<SupplierID>1</SupplierID>
<CategoryID>100</CategoryID>
<QuantityPerUnit>6</QuantityPerUnit>
<UnitPrice>1000</UnitPrice>
<UnitsInStock>10</UnitsInStock>
<UnitsOnOrder>0</UnitsOnOrder>
<ReorderLevel>1</ReorderLevel>
<Discontinued>false</Discontinued>
</Product>
我们在这里可以看到Discount作为XmlAttributeAttribute()时,它是根节点的一个属性。而其余的都是XML元素。
对于反序列化,则相对比较简单,其方法大致如下:
public object Deserialize(Type type, Stream stream)
{
XmlSerializer xmldes = new XmlSerializer(type);
return xmldes.Deserialize(stream);
}
这里的stream就是这个Product类对应的Xml,type就是product类实例化后用GetType()方法获得的type,这样就可以得到一个反序列化后的object,最后通过强制转换可以还原成一个Product。
相关文章推荐
- As3.0 xml + Loader应用代码
- 网马生成器 MS Internet Explorer XML Parsing Buffer Overflow Exploit (vista) 0day
- ext读取两种结构的xml的代码
- asp下查询xml的实现代码
- sqlserver FOR XML PATH 语句的应用
- 使用sp_xml_preparedocument处理XML文档的方法
- c#数据的序列化和反序列化(推荐版)
- SQL Server中的XML数据进行insert、update、delete
- SQL Server中的XML数据进行insert、update、delete操作实现代码
- 关于SQLServer2005的学习笔记 XML的处理
- php xml 入门学习资料
- Zend 输出产生XML解析错误
- c#序列化详解示例
- C# LINQ to XML应用介绍
- c#对象反序列化与对象序列化示例详解
- 简介C#读取XML的两种方式
- SQLServer2005 XML数据操作代码
- ASP XML制作菜单管理程序
- 让 Asp 与 XML 交互
- 【Python之旅】第三篇(二):Pickle序列化