C# 无法从实体类库.java实体类转换成json为实体类

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
三层架构中使用实体类填充泛型集合代替DataTable解决方案(ASP.NET+C#)
摘要:&用三层架构开发项目,经常会遇到如下场景:&&&&&D层负责与数据库交互,一般是得到DataTable或DataSet对象,然后返回给B层,B层进行类似的处理来读取数据:dt.Rows[0][“xxx”];或者dt.Rows[0][1];(强烈不建议使用)。&&&&&有时DataTable也会被传到UI层,与控件进行绑定,显示数据。例如ASP.NET的repeater
&用三层架构开发项目,经常会遇到如下场景:
&&&&& D层负责与数据库交互,一般是得到DataTable或DataSet对象,然后返回给B层,B层进行类似的处理来读取数据:dt.Rows[0][“xxx”];或者dt.Rows[0][1];(强烈不建议使用)。
&&&&& 有时DataTable也会被传到UI层,与控件进行绑定,显示数据。例如ASP.NET的repeater控件提取数据:&%# Eval(“xxx”)%&。
&&&&& 无论是何种情况,使用DataTable不可避免的要填写读取的字段,这样做的坏处不言而喻:
&&&&& |& 非常容易写错,而且编译器不检查。
&&&&& |& 必须了解数据库的结构。
&&&&& |& 不符合面向对象编程思想。
&&&&& |& DataTable为弱类型,无法直观的看出字段的数据类型。
&&&&& 这个问题一直困扰着我,这次借着重构机房收费系统的机会,研究了一下这个问题,找到了一种比较好的解决方案:在D层把DataTable转换成单个实体类,再把实体类填充到泛型集合中。
核心思想如图:
&&&&& 实体类即数据库的映射,因此实体类中的属性和数据库表中的字段是相对应的。把DataTable中的每一行记录视为一个实体类,把其中的字段读取出来,存放到实体类的属性中,再把所有的实体类存在泛型集合中。因此,DataTable中有多少个记录,泛型集合中就有多少个实体类,每个实体类的属性和DataTable的字段是相对应的。
&&&&& 试想一下,这样一来,传到B层或U层的将是一个实体类集合,读取数据将会是如下场景:list[0].
&&&&& 这样做的优点如下:
&&&&& |& 编写B层的人员无需手动填写需要的字段,直接按一下点,全都提示出来了,想用哪个用哪个,不会出现写错的情况。
&&&&& |& 不必了解数据库结构。
&&&&& |& 符合面向对象思想。
&&&&& |& 实体类的属性是强类型,每个字段的类型都是已知的。
&&&&& 那么用代码如何实现呢?下面一一列举。
&&&&& 注意:以下代码仅仅是为了模拟,有些不规范的地方,代码注释中有提示,切勿模仿!
实体类代码:
[csharp]&using S&using System.Collections.G&using System.L&using System.T&&namespace Entity&{&&&& /// &summary&&&&& /// Users表实体类&&&& /// &/summary&&&&& public class Users&&&& {&&&&&&&& private long _&&&&&&&& private string _userN&&&&&&&& private string _passW&&&&&&&&& public long id&&&&&&&&& {&&&&&&&&&&&& set {_id = }&&&&&&&&&&&& get { return _ }&&&&&&&& }&&&&&&&&& public string userName&&&&&&&&& {&&&&&&&&&&&& set { _userName = }&&&&&&&&&&&& get { return _userN }&&&&&&&& }&&&&&&&&& public string passWord&&&&&&&&& {&&&&&&&&&&&& set { _passWord = }&&&&&&&&&&&& get { return _passW }&&&&&&&& }&&&& }&}&
将DataTable转换成List&T&泛型集合助手类,这个类我放在了Entity实体类层中:
[csharp]&using S&using System.Collections.G&using System.L&using System.T&using System.D&using System.Data.SqlC&using System.R&&namespace Entity&{&&&& /// &summary&&&&& /// 将DataTable转换成泛型集合IList&&助手类&&&& /// &/summary&&&&& public class ConvertHelper&&&& {&&&&&&&& /// &summary&&&&&&&&& /// 单表查询结果转换成泛型集合&&&&&&&& /// &/summary&&&&&&&&& /// &typeparam name=&T&&泛型集合类型&/typeparam&&&&&&&&& /// &param name=&dt&&查询结果DataTable&/param&&&&&&&&& /// &returns&以实体类为元素的泛型集合&/returns&&&&&&&&& public static IList&T& convertToList&T&(DataTable dt) where T : new()&&&&&&&& {&&&&&&&&&&&& // 定义集合&&&&&&&&&&&& List&T& ts = new List&T&();&&&&&&&&&&&&& // 获得此模型的类型&&&&&&&&&&&& Type type = typeof(T);&&&&&&&&&&&& //定义一个临时变量&&&&&&&&&&&& string tempName = string.E&&&&&&&&&&&& //遍历DataTable中所有的数据行&&&&&&&&&&&&& foreach (DataRow dr in dt.Rows)&&&&&&&&&&&& {&&&&&&&&&&&&&&&& T t = new T();&&&&&&&&&&&&&&&& // 获得此模型的公共属性&&&&&&&&&&&&&&&& PropertyInfo[] propertys = t.GetType().GetProperties();&&&&&&&&&&&&&&&& //遍历该对象的所有属性&&&&&&&&&&&&&&&& foreach (PropertyInfo pi in propertys)&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&& tempName = pi.N//将属性名称赋值给临时变量&&&&&&&&&&&&&&&&&&&&&& //检查DataTable是否包含此列(列名==对象的属性名)&&&&&&&&&&&&&&&&&&&&&&&& if (dt.Columns.Contains(tempName))&&&&&&&&&&&&&&&&&&&& {&&&&&&&&&&&&&&&&&&&&&&&& // 判断此属性是否有Setter&&&&&&&&&&&&&&&&&&&&&&&&&& if (!pi.CanWrite)//该属性不可写,直接跳出&&&&&&&&&&&&&&&&&&&&&&&&&& //取值&&&&&&&&&&&&&&&&&&&&&&&&&& object value = dr[tempName];&&&&&&&&&&&&&&&&&&&&&&&& //如果非空,则赋给对象的属性&&&&&&&&&&&&&&&&&&&&&&&&&& if (value != DBNull.Value)&&&&&&&&&&&&&&&&&&&&&&&&&&&& pi.SetValue(t, value, null);&&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&&& //对象添加到泛型集合中&&&&&&&&&&&&&&&& ts.Add(t);&&&&&&&&&&&& }&&&&&&&&&&&&&&&&&&&&&&& }&&&& }&}&
ASP.NET Web页面后台代码(aspx.cs):
[csharp]using S&using System.Collections.G&using System.L&using System.W&using System.Web.UI;&using System.Web.UI.WebC&using E&using System.D&using System.Data.SqlC&&public partial class _Default : System.Web.UI.Page&{&&&& protected void Page_Load(object sender, EventArgs e)&&&& {&&&&&&&& if (!Page.IsPostBack)&&&&&&&&& {&&&&&&&&&&&& DataTable dt = new DataTable();&&&&&&&&&&&& IList&Users& users = new List&Users&();&&&&&&&&&&&&&&&&&&&&&&&& //注意:只是为了演示,才在这读数据库的!&&&&&&&&&&&& //在项目中千万不要这么做!另外sql链接字符串也不应该写在程序中,而且要加密。&&&&&&&&&&&& SqlConnection sqlCon = new SqlConnection(&server=192.168.24.177;database=testDB;uid=pwd=123&);&&&&&&&&&&&& SqlCommand sqlCmd = new SqlCommand(&select userName,passWord from t_testTable&, sqlCon);&&&&&&&&&&&& SqlDataReader sqlRd;&&&&&&&&&&&& sqlCon.Open();&&&&&&&&&&&& sqlRd = sqlCmd.ExecuteReader();&&&&&&&&&&&& dt.Load(sqlRd); //DataTable构造完成,在这仅仅是为了演示,构造DataTable&&&&&&&&&&&& sqlCon.Close();&&&&&&&&&&&&& users = ConvertHelper.convertToList&Users&(dt); //获取DataTable转换成的泛型集合&&&&&&&&&&&& repUsers.DataSource =&&&&&&&&&&&& repUsers.DataBind();&&&&&&&& }&&&& }&}&
ASP.NET Web页面前台代码(aspx):[html]&&%@ Page Language=&C#& AutoEventWireup=&true& CodeFile=&Default.aspx.cs& Inherits=&_Default& %&&&&!DOCTYPE html PUBLIC &-//W3C//DTD XHTML 1.0 Transitional//EN& &http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&&&&&html xmlns=&http://www.w3.org/1999/xhtml&&&&head runat=&server&&&&&& &title&&/title&&&/head&&&body&&&&& &form id=&frmDefault& runat=&server&&&&&&&&&& &&&&&&&&&&&&& &asp:Repeater ID=&repUsers& runat=&server&&&&&&&&&&&&&&&&&& &ItemTemplate&&&&&&&&&&&&&&&&&&&&& &table&&&&&&&&&&&&&&&&&&&&&&&&& &tr&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &td&&%# ((Entity.Users)Container.DataItem).id.ToString() %&&/td&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &td&&%# ((Entity.Users)Container.DataItem).userName %&&/td&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &td&&%# ((Entity.Users)Container.DataItem).passWord %&&/td&&&&&&&&&&&&&&&&&&&&&&&&& &/tr&&&&&&&&&&&&&&&&&&&&& &/table&&&&&&&&&&&&&&&&& &/ItemTemplate&&&&&&&&&&&&& &/asp:Repeater&&&&&&&&& &&&& &/form&&&/body&&&/html&&
&&&&& 这段代码在Web后台读取了数据中的数据,当然,只是为了模拟,这样写是非常不可取的。得到DataTable后利用ConvertHelper转换助手类的convertToList方法将DataTable转换成本例中的Users类型的泛型集合。最后把该集合与Repeater控件绑定,显示数据。
&&&&& Repeater之类的控件均支持绑定集合,而且支持的如此完美。个人认为界面显示那段代码是最漂亮的。
&&&&& 例如:&%#((Entity.Users)Container.DataItem).id.ToString() %&。这和以往的显示方法大不相同。首先,没有使用Eval。数据是从Container.DataItem属性中读取的,强制转换为实体类类型,然后直接调用实体类的id属性。整个代码行云流水般使用,完全不需要参照数据库,想用哪个属性用哪个。另外,这样读取效率比用Eval高。
&&&&& 在此,需要说明的是,我在这写的DataTable到List&T&的类是比较可靠的。类似ConvertHelper.convertToList&Users&(dt),想把DataTable转换成哪种实体类,调用方法的时候泛型参数(尖括号里的)就写哪个实体类,在这是Users。简单说一下它的转换原理。
&&&&& 它会自动获取实体类的属性名,然后DataTable中匹配有没有该名称的字段,有的话就赋值。DataTable中的每一行记录都这样处理。
&&&&& 基于以上原理,使用本方法必须满足以下条件,也可以说是注意事项吧:
&&&&& |& 实体类的属性名必须和数据库表中的字段名一模一样。
&&&&& |& 想用这种方法把DataTable转换成实体类,必须有已知的实体类和DataTable中的数据想对应,也就是说必须明确你要转换成的实体类类型,否则没办法指定泛型集& 合的类型,也就没办法调用。
&&&&& |& 各个表的字段尽量区别开来,不要相同。比如A表有个name字段,B表也有一个name字段,就不合理了。
&&&&& 相信你看到这已经跃跃欲试了。可仔细思考一下,会发现一个大问题:这里涉及的仅仅是单表查询,联合查询显然搞不定。
&&&&& 联合查询搞不定的主要原因是它的数据来自多个表,没有实体类与之对应,没有实体类就没有办法转换。
&&&&& 目前比普遍的解决方案就是创建一个包含多个表的实体类,只要实体类中包含联合查询的这些表就可以,实体类中表示的表多了没事。但是,很多种联合查询,就要建立很多实体类,这也是没有办法的事。
&&&&& 也有比较变态的方法就是创建一个通用实体类,包含所有表的字段。
&&&&& 要想用此方法,创建新的实体类是必然的了。但即使是这样,我们也可以节省代码,避免重复。
&&&&& 节省代码首先想到的是继承,可惜C#不支持多重继承,两个以上实体类组合成一个实体类就没辙了。用接口虽然可以实现多重继承,但显然不合理,接口不是干这个用的,这样一点代码也没省下,反而麻烦了。
&&&&& 经过网友RenYue的提示,用聚合解决是种比较好的方案。
&&&&& 聚合核心思想是:假如五个表联合查询,那么新建一个实体类,这个新实体类的属性是这个五个表对应的实体类,即用实体类封装实体类,我们暂且叫它聚合实体类。
&&&&& 这个想法很好,很好的复用了代码,但是实现起来比较复杂。刚刚提供的单个表查询的转换方法(convertToList),显然满足不了。
&&&&& 经过研究,我确定没办法写一个通用的多表查询转换方法。但是可以实现确定个数的转换方法。我写了一个两个表联合查询的转换方法。
&&&&& 把DataTable每一行记录中的字段分解给所属表对应的实体类,然后把这些实体类横向聚合到聚合实体类的属性中。如图:
为了演示,程序做如下变动:
在Entity项目中添加一个LoginLog类,用户登录日志:
[csharp]using S&using System.Collections.G&using System.L&using System.T&&namespace Entity&{&&&& /// &summary&&&&& /// LoginLog表实体类&&&& /// &/summary&&&&& public class LoginLog&&&& {&&&&&&&& private long _&&&&&&&& private string _userN&&&&&&&& private DateTime _loginT&&&&&&&& private DateTime _logoutT&&&&&&&&& public long id&&&&&&&&& {&&&&&&&&&&&& get { return _ }&&&&&&&&&&&& set { _id = }&&&&&&&& }&&&&&&&&& public string userName&&&&&&&& {&&&&&&&&&&&& get { return _userN }&&&&&&&&&&&& set { _userName = }&&&&&&&& }&&&&&&&&& public DateTime loginTime&&&&&&&&& {&&&&&&&&&&&& get { return _loginT }&&&&&&&&&&&& set { _loginTime = }&&&&&&&& }&&&&&&&&& public DateTime logoutTime&&&&&&&& {&&&&&&&&&&&& get { return _logoutT }&&&&&&&&&&&& set { _logoutTime = }&&&&&&&& }&&&& }&}&
在Entity项目中添加一个UsersJionLog类,该实体类用于Users表和LoginLog表联合查询,它的属性是Users类和LoginLog类:
[csharp]&using S&using System.Collections.G&using System.L&using System.T&&namespace Entity&{&&&& /// &summary&&&&& /// UsersJionLog表实体类,该实体类用于Users表和LoginLog表联合查询&&&& /// &/summary&&&&& public class UsersJionLog&&&& {&&&&&&&& private Users _&&&&&&&& private LoginLog _loginL&&&&&&&&& public Users users&&&&&&&&& {&&&&&&&&&&&& set { _users = }&&&&&&&&&&&& get { return _ }&&&&&&&& }&&&&&&&&& public LoginLog loginLog&&&&&&&& {&&&&&&&&&&&& set { _loginLog = }&&&&&&&&&&&& get { return _loginL }&&&&&&&& }&&&& }&}&
在ConvertHelper类中添加两个表联合查询的转换方法:
[csharp]/// &summary&&/// 两表查询结果转换成泛型集合&/// &/summary&&/// &typeparam name=&T&&包含了两个表的实体类,聚合实体类&/typeparam&&/// &typeparam name=&U&&实体类中的第一个实体类&/typeparam&&/// &typeparam name=&V&&实体类中的第二个实体类&/typeparam&&/// &param name=&dt&&从数据库中查询获得的DataTable&/param&&/// &returns&以实体类为元素的泛型集合&/returns&&public static IList&T& convertToJiontList&T, U, V&(DataTable dt)&&&& where T : new()&&&& where U : new()&&&& where V : new()&{&&&& //定义一个聚合实体类泛型集合,用来做返回值&&&& List&T& ts = new List&T&();&&&& //定义一个泛型集合元素,用来填充集合&&&& T t = new T();&&&& //获取聚合实体类的属性&&&& PropertyInfo[] propertys = t.GetType().GetProperties();&&&& //利用单表转换,把DataTable数据填充到聚合实体类中第一个实体类&&&& IList&U& uList = new List&U&();&&&& uList = convertToList&U&(dt);&&&& //利用单表转换,把DataTable数据填充到聚合实体类中第二个实体类&&&& IList&V& vList = new List&V&();&&&& vList = convertToList&V&(dt);&&&&& //经过以上两步,uList和vList两个集合的长度肯定是相同的&&&&& //把两个实体类填充到聚合实体类中&&&& for (int i = 0; i & uList.C i++)&&&&& {&&&&&&&& propertys[0].SetValue(t, uList[i], null); //取uList中第i个元素,填充到聚合实体类的第一个属性中&&&&&&&& propertys[1].SetValue(t, vList[i], null); //取vList中第i个元素,填充到聚合实体类的第二个属性中&&&&&&&& ts.Add(t); //向聚合实体类集合中添加元素&&&& }&&&&&}&
ASP.NET Web后台(aspx.cs)代码:
[csharp]&using S&using System.Collections.G&using System.L&using System.W&using System.Web.UI;&using System.Web.UI.WebC&using E&using System.D&using System.Data.SqlC&&public partial class _Default : System.Web.UI.Page&{&&&& protected void Page_Load(object sender, EventArgs e)&&&& {&&&&&&&& if (!Page.IsPostBack)&&&&&&&&& {&&&&&&&&&&&& DataTable dt = new DataTable();&&&&&&&&&&&& IList&UsersJionLog& usersJionLog = new List&UsersJionLog&();&&&&&&&&&&&&& //注意:只是为了演示,才在这读数据库的!&&&&&&&&&&&& //在项目中千万不要这么做!另外sql链接字符串也不应该写在程序中,而且要加密。&&&&&&&&&&&& SqlConnection sqlCon = new SqlConnection(&server=192.168.24.177;database=testDB;uid=pwd=123&);&&&&&&&&&&&& SqlCommand sqlCmd = new SqlCommand(&select t_Users.userName,t_LoginLog.loginTime,t_LoginLog.logoutTime from t_Users join t_LoginLog on t_LoginLog.userName = t_Users.userName where t_Users.userName = 'admin'&, sqlCon);&&&&&&&&&&&& SqlDataReader sqlRd;&&&&&&&&&&&& sqlCon.Open();&&&&&&&&&&&& sqlRd = sqlCmd.ExecuteReader();&&&&&&&&&&&& dt.Load(sqlRd); //DataTable构造完成,在这仅仅是为了演示,构造DataTable&&&&&&&&&&&& sqlCon.Close();&&&&&&&&&&&&& usersJionLog = ConvertHelper.convertToJiontList&UsersJionLog,Users,LoginLog&(dt);&&&&&&&&&&&&& repUsers.DataSource = usersJionL&&&&&&&&&&&& repUsers.DataBind();&&&&&&&& }&&&& }&}&
ASP.NET Web前台(aspx):
[html]&%@ Page Language=&C#& AutoEventWireup=&true& CodeFile=&Default.aspx.cs& Inherits=&_Default& %&&&&!DOCTYPE html PUBLIC &-//W3C//DTD XHTML 1.0 Transitional//EN& &http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&&&&&html xmlns=&http://www.w3.org/1999/xhtml&&&&head runat=&server&&&&&& &title&&/title&&&/head&&&body&&&&& &form id=&frmDefault& runat=&server&&&&&&&&&& &&&&&&&&&&&&& &asp:Repeater ID=&repUsers& runat=&server&&&&&&&&&&&&&&&&&& &ItemTemplate&&&&&&&&&&&&&&&&&&&&& &table&&&&&&&&&&&&&&&&&&&&&&&&& &tr&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &td&&%# ((Entity.UsersJionLog)Container.DataItem).users.userName %&&/td&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &td&&%# ((Entity.UsersJionLog)Container.DataItem).loginLog.loginTime.ToString() %&&/td&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &td&&%# ((Entity.UsersJionLog)Container.DataItem).loginLog.logoutTime.ToString() %&&/td&&&&&&&&&&&&&&&&&&&&&&&&& &/tr&&&&&&&&&&&&&&&&&&&&& &/table&&&&&&&&&&&&&&&&& &/ItemTemplate&&&&&&&&&&&&& &/asp:Repeater&&&&&&&&& &&&& &/form&&&/body&&&/html&&
&&&&& 这样就可以啦。
&&&&& 需要解释的有两个地方:
&&&&& ConvertHelper.convertToJiontList&UsersJionLog,Users,LoginLog&(dt);这句调用代码,注意该方法需要三个类型,这三个类型第一个是返回的实体类类型,也就是聚合实体类;第二个参数是聚合实体类中的第一个属性的类型;第三个参数是聚合类中第二个属性的类型。必须一一对应,否则没法转换!
&&&&& 另外Web界面上的调用代码,例如&%#((Entity.UsersJionLog)Container.DataItem).users.userName %&,这句话就是先把Container.DataItem转换成聚合实体类UsersJionLog,然后读取聚合实体类中的users属性,这个属性也是一个类(Users类),因此有自己的属性userName。
&&&&& 这样就实现了多表联合查询的转换。聚合类代表了联合查询的所有表,想读取其中的哪个表,点一下选出来,然后再点一下就可以读出这个表中的字段了,相当好用!
&&&&& 根据两个表联合查询的转换思路,我们可以写出N个表联合查询的转换方法,但是没办法通用,因为泛型的的类型必须是已知的,相信读者可以体会到。
&&&&& 写的比较仓促,希望对大家有所帮助!
&&&&& 有问题欢迎和我交流!
本文所用数据库创建脚本:
[sql]&create database testDB;&use testDB;&create table t_Users(&&&& id bigint IDENTITY(1,1) PRIMARY KEY,&&&& userName varchar(100) NOT NULL UNIQUE,&&&& passWord varchar(100) NOT NULL&);&insert into t_Users(userName,passWord) values('admin','123');&insert into t_Users(userName,passWord) values('guest','456');&&create tabLe t_LoginLog(&&&& id bigint IDENTITY(1,1) PRIMARY KEY,&&&& userName varchar(100),&&&& loginTime datetime NOT NULL,&&&& logoutTime datetime NOT NULL,&&&& CONSTRAINT FK_LoginLog_userName FOREIGN KEY(userName) REFERENCES t_Users(userName)&);&&insert into t_LoginLog(userName,loginTime,logoutTime)values('admin','','');&insert into t_LoginLog(userName,loginTime,logoutTime)values('guest','','');&insert into t_LoginLog(userName,loginTime,logoutTime)values('admin','','');&insert into t_LoginLog(userName,loginTime,logoutTime)values('guest','','');&作者:yangyuankp
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
三层架构中使用实体类填充泛型集合代替DataTable解决方案(ASP.NET+C#)相关信息,包括
的信息,所有三层架构中使用实体类填充泛型集合代替DataTable解决方案(ASP.NET+C#)相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International我们需要在XML与实体类,DataTable,List之间进行转换,下面是XmlUtil类,该类来自网络并稍加修改。
using System.Collections.G
using System.L
using System.T
using System.IO;
using System.D
using System.X
using System.Xml.S
/// &summary&
/// Xml序列化与反序列化
/// &/summary&
public class XmlUtil
#region 反序列化
/// &summary&
/// 反序列化
/// &/summary&
/// &param name="type"&类型&/param&
/// &param name="xml"&XML字符串&/param&
/// &returns&&/returns&
public static object Deserialize(Type type, string xml)
using (StringReader sr = new StringReader(xml))
XmlSerializer xmldes = new XmlSerializer(type);
return xmldes.Deserialize(sr);
catch (Exception e)
/// &summary&
/// 反序列化
/// &/summary&
/// &param name="type"&&/param&
/// &param name="xml"&&/param&
/// &returns&&/returns&
public static object Deserialize(Type type, Stream stream)
XmlSerializer xmldes = new XmlSerializer(type);
return xmldes.Deserialize(stream);
#endregion
#region 序列化
/// &summary&
/// 序列化
/// &/summary&
/// &param name="type"&类型&/param&
/// &param name="obj"&对象&/param&
/// &returns&&/returns&
public static string Serializer(Type type, object obj)
MemoryStream Stream = new MemoryStream();
XmlSerializer xml = new XmlSerializer(type);
//序列化对象
xml.Serialize(Stream, obj);
catch (InvalidOperationException)
Stream.Position = 0;
StreamReader sr = new StreamReader(Stream);
string str = sr.ReadToEnd();
sr.Dispose();
Stream.Dispose();
#endregion
下面是测试代码:
1. 实体对象转换到Xml
public class Student
public string Name { }
public int Age { }
Student stu1 = new Student() { Name = "okbase", Age = 10 };
string xml = XmlUtil.Serializer(typeof(Student), stu1);
Console.Write(xml);
2.&Xml转换到实体对象
Student stu2 = XmlUtil.Deserialize(typeof(Student), xml) as S
Console.Write(string.Format("名字:{0},年龄:{1}", stu2.Name, stu2.Age));
3.&DataTable转换到Xml
// 生成DataTable对象用于测试
DataTable dt1 = new DataTable("mytable");
// 必须指明DataTable名称
dt1.Columns.Add("Dosage", typeof(int));
dt1.Columns.Add("Drug", typeof(string));
dt1.Columns.Add("Patient", typeof(string));
dt1.Columns.Add("Date", typeof(DateTime));
dt1.Rows.Add(25, "Indocin", "David", DateTime.Now);
dt1.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
dt1.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
dt1.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
dt1.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
xml = XmlUtil.Serializer(typeof(DataTable), dt1);
Console.Write(xml);
4.&Xml转换到DataTable
// 反序列化
DataTable dt2 = XmlUtil.Deserialize(typeof(DataTable), xml) as DataT
// 输出测试结果
foreach (DataRow dr in dt2.Rows)
foreach (DataColumn col in dt2.Columns)
Console.Write(dr[col].ToString() + " ");
Console.Write("\r\n");
5.&List转换到Xml
// 生成List对象用于测试
List&Student& list1 = new List&Student&(3);
list1.Add(new Student() { Name = "okbase", Age = 10 });
list1.Add(new Student() { Name = "csdn", Age = 15 });
xml = XmlUtil.Serializer(typeof(List&Student&), list1);
Console.Write(xml);
6.&Xml转换到List
List&Student& list2 = XmlUtil.Deserialize(typeof(List&Student&), xml) as List&Student&;
foreach (Student stu in list2)
Console.WriteLine(stu.Name + "," + stu.Age.ToString());
从代码可以看到,千变万化不离其宗!
如果本文对您有帮助,请打赏支持一下作者,谢谢您!
支付宝打赏
lzh6927912
精炼,带走了,谢谢分享!!
&script&alert('123')&/script&
好像不错 copy了 哈哈
还是有问题,用你的方法生成一个xml,然后转化为DataTable就有问题。
xml转化成table有问题
怎么加属性呢 比如&&&Command name=&123& sn=1&
求助,xml转list时报错说我的“list&&是一个类型,在给定的上下文中无效”,怎么解决
您还没有登录,请或

我要回帖

更多关于 将实体类转换成json 的文章

 

随机推荐