刚接触.net时,就看到过一些用到XML Serialization的例子,当时没什么感觉。后来看了SDK和一些较大的程序后,逐渐有了点感觉。我个人感觉XML Serialization 的最大好处是可以将一个XML文件对象化,比如说XML中的元素、属性等都可以对应到对象、对象的属性。
这样我们可以用对象的思想来操作数据,由于目前主流数据库还只是关系型的(Oracle也只是部分面向对象),我们在数据层的操作显得于其他层面有点隔。而XML Serialization给了我们这样一个用面向对象的思维来操作数据的可能。据个例子来说,比如说我们要做一个制作工作流程的程序,每个流程有n个阶段,每个阶段有n个人来完成。如果用数据库做,就不可避免的涉及到多表关联。这对于这样一个数据量比较小的程序来说是一个浪费。我们来看一下怎么利用XML来做。
///示例XML文件
<?XML version="1.0"?>
<WorkflowData XMLns:xsi="http://www.w3.org/1999/XMLSchema-instance" XMLns:xsd="http://www.w3.org/1999/XMLSchema">
<workflows>
<workflow name="请假流程" id="1">
<stages>
<stage name="主管核准" id="1" ordernum="1">
<users>
<user name="James" isAudit="1"/>
</users>
</stage>
</stages>
</workflow>
</workflows>
</WorkflowConfigData>
///示例cs文件
using System;
using System.Collections;
using System.IO;
using System.Text;
using System.Web;
using System.XML.Serialization;
namespace Portal.Modules.Workflow
{
public class WorkflowConfig
{
public static WorkflowData Settings
{
get
{
HttpContext context = HttpContext.Current;
WorkflowData data = (WorkflowData) context.Cache["workflowconfig"];
if (data == null)
{
data = LoadSettings(WorkflowConfig.ConfigFilePath);
context.Cache.Insert("workflowconfig", data, new CacheDependency(WorkflowConfig.ConfigFilePath));
}
}
}
public static String ConfigFilePath
{
get
{
HttpContext context = HttpContext.Current;
return context.Server.MapPath(context.Request.ApplicationPath + "//" + "Workflow//workflow.XML");
}
}
public static WorkflowData LoadSettings(String fileName)
{
StreamReader reader = File.OpenText(fileName);
XMLSerializer serializer = new XMLSerializer(typeof(WorkflowData));
WorkflowData data = (WorkflowData)serializer.Deserialize(reader);
reader.Close();
return data;
}
public static void PersistSettings(WorkflowData data)
{
HttpContext context = HttpContext.Current;
String configFilePath = context.Server.MapPath(context.Request.ApplicationPath + "//Workflow//workflow.XML");
StreamWriter writer = File.CreateText(configFilePath);
XMLSerializer serializer = new XMLSerializer(typeof(WorkflowData));
serializer.Serialize(writer, data);
writer.Close();
}
}
public class WorkflowData
{
private Workflow[] _workflows;
[XMLArray]
public Workflow [] Workflows
{
get
{
return _workflows;
}
set
{
_workflows = value;
}
}
[XMLIgnore]
public Workflow this[int workflowID]
{
get
{
foreach(Workflow workflow in Workflows)
{
if(workflowID == workflow.ID)
&nbs
更多内容请看PCdog.com--开发应用专题
