当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > DataRow的序列化问题

ASP.NET
二级域名Cookie问题的解决方法
如何为asp.net网站项目添加子项目
asp.net用url重写URLReWriter实现任意二级域名
asp.net 序列化and反序列化演示
asp.net Timer的使用方法
AjaxControlToolKit DropDownExtender(下拉扩展控件)使用方法
AjaxControlToolKit CalendarExtender(日历扩展控件)的使用方法
让GridView只显示特定用户的数据的方法
让GridView只更新某些特定的数据的方法
ajaxControlToolkit中CascadingDropDown的用法说明
axp.net ScriptManager的简单用法
把程序集安装到全局程序集缓存中的步骤
引用全局程序集缓存内的程序集的方法
asp.net COOKIES需要注意的一点
asp.net UrlReWriter使用经验小结
页面导出为Excel的时间格式的问题
asp.net cookie清除的代码
Asp.net XMLHTTP封装类(GET,Post发送和接收数据)
ASP.NET XmlHttp跨域访问实现代码
Asp.NET 随机码生成基类(随机字母,随机数字,随机字母+数字)

ASP.NET 中的 DataRow的序列化问题


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 199 ::
收藏到网摘: n/a


在.net里,DataRow类型的对象是不支持序列化的,那么如果在一个需要序列化的对象中含有DataRow类型的字段该怎么办呢?呵呵,幸好Datatable是支持序列化的。因此,我们可以自定义序列化的行为,并在序列化和反序列化的时候用Datatable来对DataRow进行包装和解包。
为了自定义序列化行为,必须实现ISerializable接口。实现这个接口要实现 GetObjectData 方法以及在反序列化对象时使用的特殊构造函数。前者的作用是把该对象要封装的数据加入到系统提供的一个容器中,然后系统会对这些数据进行序列化;后者的作用是把反序列化的数据从容器中取出来,然后显式的赋值给该对象的某一个字段。
如下例所示,应当注意的代码用黑体标出。

using System;
using System.Data;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.IO;
using System.Security.Permissions;

namespace phenix.Dl
{
///
/// Field 的摘要说明。
///

[Serializable]
public class Field:ISerializable
{
private string name="";
private DataRow dr=null;
private string title="";
private int index=-1;
public int Index
{
get{return this.index;}
set{this.index=value;}
}
public string Title

{
get{return this.title;}
set{this.title=value;}
}
public string FieldName
{
get{return this.name;}
set{this.name=value;}
}
public DataRow FieldInfo
{
get{return this.dr;}
set{this.dr=value;}
}
public Field()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
protected Field(SerializationInfo info, StreamingContext context)//特殊的构造函数,反序列化时自动调用
{
this.name=info.GetString("fieldname");
this.title=info.GetString("fieldtitle");
this.index=info.GetInt32("fieldindex");
DataTable dt=info.GetValue("fieldinfo",new DataTable().GetType()) as DataTable;
this.dr=dt.Rows[0];
}
[SecurityPermissionAttribute(SecurityAction.Demand,SerializationFormatter=true)]
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)//序列化时自动调用
{
info.AddValue("fieldname", this.name);
info.AddValue("fieldtitle", this.title);
info.AddValue("fieldindex", this.index);
DataTable dt=this.dr.Table.Clone(); //datarow不能同时加入到两个DataTable中,必须先克隆一个
DataRow row=dt.NewRow();
row.ItemArray=dr.ItemArray;

dt.Rows.Add(row);
info.AddValue("fieldinfo",dt,dt.GetType());
}
public override string ToString()
{
return this.name; } }}