DataRow的序列化問題

來源:互聯網
上載者:User
問題 在.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
{
/// <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;
}

}
}



相關關鍵詞:
相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。