利用反射自定义序列化DataSet
2005-03-30 16:13 netwy 阅读(2610) 评论(1) 编辑 收藏 举报
首先定义两个实体类:OFFICEData,UserData
OFFICEData:
[System.ComponentModel.DesignerCategory("Code")]
[SerializableAttribute]
public class OFFICEData: DataSet,ISerializable
{
public const string T_OFFICE_OFFICEID="OFFICEID";
public const string T_OFFICE_CODENO="CODENO";
public const string T_OFFICE_SPELLNO="SPELLNO";
public const string T_OFFICE_CUSTOMNO="CUSTOMNO";
public const string T_OFFICE_STROKENO="STROKENO";
public const string T_OFFICE_OFFICE="OFFICE";
public const string T_OFFICE_DISEASEAREA="DISEASEAREA";
public const string T_OFFICE_BEDAMOUNT="BEDAMOUNT";
public const string T_OFFICE_LIMITFUND="LIMITFUND";
public const string T_OFFICE_OFFICETYPE="OFFICETYPE";
public const string T_OFFICE_DEPARTMENT="DEPARTMENT";
public const string T_OFFICE_POSITION="POSITION";
private DataTable table;
private DataColumn col;
private ArrayList list;
private UserData user = new UserData();
public UserData userData
{
get{return this.user ;}
set{this.user = value;}
}
private OFFICEData(SerializationInfo info, StreamingContext context) : base(info, context)
{
userData=(UserData)info.GetValue("myData",typeof(Serialize.UserData));
}
public OFFICEData()
{
BuildDataTables();
}
public void GetObjectData(SerializationInfo info,StreamingContext text)
{
Type t = typeof(DataSet);
MethodInfo mi =t.GetMethod("System.Runtime.Serialization.ISerializable.GetObjectData",BindingFlags.Instance |BindingFlags.NonPublic );
mi.Invoke(this,new object[]{info,text});
info.AddValue("myData",userData);
}
//构建业务实体类的结构。
private void BuildDataTables()
{
table = new DataTable("T_OFFICE");
table.Columns.Add("OFFICEID",typeof(System.Decimal));
table.Columns.Add("CODENO",typeof(System.String));
table.Columns.Add("SPELLNO",typeof(System.String));
table.Columns.Add("CUSTOMNO",typeof(System.String));
table.Columns.Add("STROKENO",typeof(System.String));
table.Columns.Add("OFFICE",typeof(System.String));
table.Columns.Add("DISEASEAREA",typeof(System.String));
table.Columns.Add("BEDAMOUNT",typeof(System.Decimal));
table.Columns.Add("LIMITFUND",typeof(System.Decimal));
table.Columns.Add("OFFICETYPE",typeof(System.String));
table.Columns.Add("DEPARTMENT",typeof(System.String));
table.Columns.Add("POSITION",typeof(System.String));
list=new ArrayList();
col=table.Columns["OFFICEID"];
list.Add(col);
table.PrimaryKey=(DataColumn[])list.ToArray(typeof(DataColumn));
this.Tables.Add(table);
}
}
UserData:
[System.ComponentModel.DesignerCategory("Code")]
[SerializableAttribute]
public class UserData: DataSet
{
public const string T_USERS_UserID="UserID";
public const string T_USERS_CodeNo="CodeNo";
public const string T_USERS_SpellNo="SpellNo";
public const string T_USERS_CustomNo="CustomNo";
public const string T_USERS_StrokeNo="StrokeNo";
public const string T_USERS_UserName="UserName";
public const string T_USERS_Sex="Sex";
public const string T_USERS_Birthday="Birthday";
public const string T_USERS_Nation="Nation";
public const string T_USERS_Diploma="Diploma";
public const string T_USERS_Office="Office";
public const string T_USERS_LaborageNo="LaborageNo";
public const string T_USERS_Duty="Duty";
public const string T_USERS_PledgeMoney="PledgeMoney";
public const string T_USERS_WorkKind="WorkKind";
private DataTable table;
private DataColumn col;
private ArrayList list;
private UserData(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
public UserData()
{
BuildDataTables();
}
//构建业务实体类的结构。
private void BuildDataTables()
{
table = new DataTable("T_USERS");
table.Columns.Add("UserID",typeof(System.Int32));
table.Columns.Add("CodeNo",typeof(System.String));
table.Columns.Add("SpellNo",typeof(System.String));
table.Columns.Add("CustomNo",typeof(System.String));
table.Columns.Add("StrokeNo",typeof(System.String));
table.Columns.Add("UserName",typeof(System.String));
table.Columns.Add("Sex",typeof(System.String));
table.Columns.Add("Birthday",typeof(System.DateTime));
table.Columns.Add("Nation",typeof(System.String));
table.Columns.Add("Diploma",typeof(System.String));
table.Columns.Add("Office",typeof(System.String));
table.Columns.Add("LaborageNo",typeof(System.String));
table.Columns.Add("Duty",typeof(System.String));
table.Columns.Add("PledgeMoney",typeof(System.Decimal));
table.Columns.Add("WorkKind",typeof(System.String));
list=new ArrayList();
col=table.Columns["UserID"];
list.Add(col);
table.PrimaryKey=(DataColumn[])list.ToArray(typeof(DataColumn));
this.Tables.Add(table);
}
}
因为DataSet实现了序列化接口ISerializable,而基类的DataSet.GetObjectData是私有的,
如果从实现了 ISerializable 的类派生出一个新的类,则只要新的类中含有任何需要序列化的变量,
就必须同时实现构造函数以及 GetObjectData 方法
DataSet实现了ISerializable,但是,他确封装了GetObjectData方法
所以在OFFICEData.GetObjectData中利用反射调用DataSet.GetObjectData方法.
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
因为DataSet实现了序列化接口ISerializable,而基类的DataSet.GetObjectData是私有的,
如果从实现了 ISerializable 的类派生出一个新的类,则只要新的类中含有任何需要序列化的变量,
就必须同时实现构造函数以及 GetObjectData 方法
DataSet实现了ISerializable,但是,他确封装了GetObjectData方法
所以在OFFICEData.GetObjectData中利用反射调用DataSet.GetObjectData方法.