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

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 72 ::
收藏到网摘: 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; } }}