在.net里,DataRow类型的对象是不支持序列化的,那么如果在一个需要序列化的对象中含有DataRow类型的字段该怎么办呢?呵呵,幸好Datatable是支持序列化的。因此,我们可以自定义序列化的行为,并在序列化和反序列化的时候用Datatable来对DataRow进行包装和解包。 为了自定义序列化行为,必须实现ISerializable接口。实现这个接口要实现 <?XML:NAMESPACE PREFIX = MSHelp NS = "http://msdn.microsoft.com/mshelp" />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 { /// <summary> /// Field 的摘要说明。 /// </summary> [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; }
} }
<script event=onload for=window type=text/javascript>ImgLoad(document.getElementById("BodyLabel"));</script>
本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。