代码改变世界

利用反射自定义序列化DataSet

2005-03-30 16:13  netwy  阅读(2608)  评论(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方法.