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

ASP.NET
C#中使Datawindow.Net组件处理数据
在.net开发中几个重要的认识误区(1)
WML教程11:文本框控件(Input)
WML教程6:动作和链接
在WEB自定义控件中实现事件及自动保存值
WML教程14:WML 文本处理
表单启动太慢时显示一个等待图标(类似Windows下的时间沙漏)
ADO.NET学习笔记(二)
使用HttpContext中的User属性来实现用户身份验证之用户验证票篇
由DataGrid翻页所导致的诸多问题的解决方案
动态加载类的原理:元数据的使用
用C#实现Des加密和解密
快速对图片进行滤光处理
可以代替窗体Refresh方法的函数
『原创』适合初学的简单3D碰撞检测初探(对于3D编程初学人员)
《Essential .Net》读书笔记 - Chapter 3
Lion.Web.WebHtmlEditor 1.0 Hack 攻略
数据库事务处理的另外一种方法
[WSE]Web Service—后台侦听服务通过WSE2.0建立订阅/发布关系
给windows服务添加描述

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


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