在做一个CMS后台管理菜单时学到的XML 序列化的一个应用,先建立一个XML文件,然后用DataSet读取之内容.
1。XML 序列化 基础知识
序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
XML 序列化仅将对象的公共字段和属性值序列化为 XML 流。XML 序列化不包括类型信息。例如,如果您有一个存在于 Library 命名空间中的 Book 对象,将不能保证它将会被反序列化为同一类型的对象。
XML 序列化中最主要的类是 XmlSerializer 类,它的最重要的方法是 Serialize 和 Deserialize 方法。
简单类的序列化
下面的示例显示一个具有公共字段的简单类:
public class OrderForm{
public DateTime OrderDate;
}
当将此类的实例序列化时,该实例可能类似于下面的代码:
<OrderForm>
<OrderDate>12/12/01</OrderDate>
</OrderForm>
使用 XmLSerializer 类,可将下列项序列化。
- 公共类的公共读/写属性和字段
- 实现 ICollection 或 IEnumerable 的类。(注意只有集合会被序列化,而公共属性却不会。)
- XmlElement 对象。
- XmlNode 对象。
- DataSet 对象。
序列化对象
若要序列化对象,首先创建要序列化的对象并设置它的公共属性和字段。为此,必须确定要用以存储 XML 流的传输格式(或者作为流,或者作为文件)。例如,如果 XML 流必须以永久形式保存,则创建 FileStream 对象。当您反序列化对象时,传输格式确定您将创建流还是文件对象。确定了传输格式之后,就可以根据需要调用 Serialize 或 Deserialize 方法。
序列化对象
创建对象并设置它的公共字段和属性。
使用该对象的类型构造 XmlSerializer。有关更多信息,请参见 XmlSerializer 类构造函数。
调用 Serialize 方法以生成对象的公共属性和字段的 XML 流表示形式或文件表示形式。下面的示例创建一个文件。
MySerializableClass myObject = new MySerializableClass();
// Insert code to set properties and fields of the object.
XmlSerializer mySerializer = new
XmlSerializer(typeof(MySerializableClass));
// To write to a file, create a StreamWriter object.
StreamWriter myWriter = new StreamWriter("myFileName.xml");
mySerializer.Serialize(myWriter, myObject);
反序列化对象
使用要反序列化的对象的类型构造 XmlSerializer。
调用 Deserialize 方法以产生该对象的副本。在反序列化时,必须将返回的对象强制转换为原始对象的类型,如下面的示例中所示。下面的示例将该对象反序列化为文件,尽管它也可以被反序列化为流。
MySerializableClass myObject;
// Constructs an instance of the XmlSerializer with the type
// of object that is being deserialized.
XmlSerializer mySerializer =
new XmlSerializer(typeof(MySerializableClass));
// To read the file, creates a FileStream.
FileStream myFileStream =
new FileStream("myFileName.xml", FileMode.Open);
// Calls the Deserialize method and casts to the object type.
myObject = (MySerializableClass) //注意,没有分号!
2.如何在做CMS后台管理菜单时应用
先建立一个XML文件
<?xml version="1.0"?>
<Items>
<Item>
<ID>User</ID>
<Text>用户管理</Text>
<Link>UserList.aspx</Link>
</Item>
<Item>
<ID>Column</ID>
<Text>新闻管理</Text>
<Link>ColumnList.aspx</Linkk>
</Item>
.......................................
</Items>
然后添加一个Menu的Web窗体,添加一个Repeater控件,其html代码:
<asp:repeater id="Repeater1" runat="Server" >
<ItemTemplate>
<%#DataBinder.Eval(Container.DataItem,"LeadTag")%><A runat="server"><%#DataBinder.Eval(Container.DataItem,"Link")%>
<asp:Label id="itemLabel" runat="server">
<%#DataBinder.Eval(Container.DataItem,"Text")%>
</asp:Label>
</A>
</ItemTemplate>
Menu.aspx.cs代码为:
public class Menu
{protected System.Web.UI.WebControls.Repeater Repeater1;
private string currColumn;//当前栏目名称
private string xmlsrc;//xml文件的存储目录
public string Src {set{xmlsrc=value;}}
public string Column{set{currColumn=value;}}
if(xmlsrc!=null){
DataSet ds=new DataSet();
ds.ReadXml(Server.MapPath(xmlsrc));
DataColumn dc;
dc=new DataColumn("isCurrItem",Type,GetTypes(System.Boolean"));
dt.Column.Add(dc);
DataRow dr;
for(int i=0;i<dt.Rows.Count;i++)
{dr=dt.Rows[i];
dr["isCurrItem"]=(dr["ID"].ToString()++currColumn);
if(Boolean)(dr["Text"].ToString()[0]=='-'))
{dr["Text"]=dr["Text"].ToString().Remove(0,1);}
}
Repeater.DataSource=ds;
Repeater.DataBind();
}
private void Repeater_ItemDateBound(object sender,System.Web.UI.WebControls.RepeaterItemEventArgs e)
{DataRowView currDataItem=(DataRowView)e.Item.DataItem;
Label currLabel1=(Label)e.Item.FindControl("itemLabel");
if((Boolean)currDataItem["isCurrItem"])
{currLabel.CssClass="Yellowcontent";}//一个样式
}