MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进

 在前面几篇《在Web Service中使用dOOdad》中,我提到用ToXml/FromXml来实现在WebService中使用dOOdad。但在具体的项目实践中,我有遇到一个新问题:将一个业务实体ToXml后得到字符串,然后再对FromXml来解析字符串,获得新的实体,但这个实体已严重失真,其中的DataTable丢失了Schema,会导致部分数据类型(如数据库中的Image类型)对应的字段不能解析回来,这时调用Save方法时就会出错。

dOOdad项目源代码中的ToXml和FromXml:

MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进virtual public string ToXml()
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
{
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进   DataSet dataSet 
= new DataSet();
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进   dataSet.Tables.Add(_dataTable);
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进   StringWriter writer 
= new StringWriter();
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进   dataSet.WriteXml(writer);
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进   dataSet.Tables.Clear();
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进   
return writer.ToString();
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进}

MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
virtual public void FromXml(string xml)
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
{
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进   DataSet dataSet 
= new DataSet();
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进   StringReader reader 
= new StringReader(xml);
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进   dataSet.ReadXml(reader);
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进   
this.DataTable = dataSet.Tables[0];
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进   dataSet.Tables.Clear();
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进}

 


       针对如上所述问题,我的一个解决办法是重新构造Schema。下面是我的大致思路:

MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进//BusinessEntity中:
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
virtual public string ToXml()
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
{
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进    StringWriter writer 
= new StringWriter();
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进    
this.DataTable.WriteXml(writer);//ADO.Net 2.0中DataTable支持WriteXml和ReadXml
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
    return writer.ToString();       //此时的返回值中不含Schema
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
}

MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
virtual public void FromXml(string xml)
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
{
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进    
this.CreatDataTable();
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进    StringReader reader 
= new StringReader(xml);
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进    
this.DataTable.ReadXml(reader);
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进    
this.DataTable = _dataTable;//记得加上这条语句
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
}

MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
protected virtual void CreatDataTable()  
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
{
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进    
//为空,由子类来选择实现或者不实现。
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进    
//当然我们也可以将方法设为abstact,强迫子类来实现,但这样不太厚道:
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进    
//具体的应用中未必会每个业务实体都用到ToXml/FromXml转换,所以不建议设为abstract
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
}

 

//ConcreteClass中:(ps:建议在ConcreteClass中实现自己的代码,而不要把自己的代码写到dOOdad生成的AbstactClass中;因为如果数据库中表的字段作了局部调整后,AbstractClass中需要作很多琐碎的改动,倒不如删掉AbsractClass重新再用MyGeneration来生成代码,而自己加入的代码又得重新写过。)

MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进public override void AddNew()
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
{
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进     
this.CreatDataTable();//重构了一下,抽取出一个方法
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
     base.AddNew();
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进}

MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
protected override void CreatDataTable()
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
{
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进     
this.DataTable = new DataTable(this.MappingName);
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进     
this.AddColumn(Employee.ColumnNames.ID, typeof(int));
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进     
this.AddColumn(Employee.ColumnNames.FirstName, typeof(string));
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进     
this.AddColumn(Employee.ColumnNames.LastName, typeof(string));
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进     
//.........
MyGeneration学习笔记(9) :在WebService使用dOOdad时,对ToXml/FromXml的一点改进
}
 


      现在就可以通过ToXml和FromXml来实现字符串(不含Schema)与业务实体的近似对等转换(注意:这里仅仅是说近似对等转换,因为DataRow的状态还是丢失了,所以在FromXml后,CurrentRow的状态处于Added;此时如果是想实现对数据库记录的修改,则还需调用AcceptChanges()和SetModified()(MyGeneration学习笔记(6) :在Web Service中使用dOOdad(下) 有讲)重新设置其状态才实现修改。)


     补充:上面所讲的是实现在网络中只传输DataTable中的数据,而不传输DataTable的Schema。事实上,dOOdad中已实现了另一种方法来实现字符串(含Schema和数据)与业务实体的转换,即Serialize()和Deserialize()方法,且这种序列化是高保真的,可以使得业务实体通过XML字符串实现完全对等转换。但这种方法的一个不足之处是传输数据时需要传输Schema,我试过用Serialize()序列化我的项目中的一个业务实体,得到的Xml字符串的长度是3460,而ToXml()得到的字符串的长度是1857,二者相差1603个字符。一个Unicode字符占4个byte,则每次Serialize()得到的结果要比ToXml()得到的结果大1603*4Byte(大约6.26k);而当系统中很多个客户端同时请求这种获取数据的WebMethod接口时,就不得不考虑WebService服务器的网络负担了。


本文转自Silent Void博客园博客,原文链接:http://www.cnblogs.com/happyhippy/archive/2006/09/02/601233.html,如需转载请自行联系原作者

上一篇:实战安装Ubuntu系统全过程---(lihong出品)


下一篇:Mybatis 分页插件 3.7.1 发布