Remoting系列专题---自定义序列化类

最近项目开发中的传输数据是围绕Remoting而召开的,所以想把所有的数据实体都定义统一的格式,于是就写了一个基于DataTable的基类BaseModal,其他数据实体全部继承于它。此BaseModal基类还包括了一些其他的自有的属性,例如pageSize每页记录数、currentPage当前页码等等,代码如下:

  1
  2文件描述
 13
 14修改记录
 21
 22using System;
 23using System.Data;
 24using System.Text;
 25using System.Runtime.Serialization;
 26
 27namespace Colorful.Model
 28{
 29    /// <summary>
 30    /// 数据基本表
 31    /// </summary>

 32    [Serializable]
 33    public class BaseModel : DataTable
 34    {
 35        protected   int     index;          //记录当前行
 36        protected   int     pageSize;       //每页记录数
 37        protected   int     currentPage;    //当前页码
 38        protected   int     pages;          //总页数
 39        protected   long    totalRecord;    //总记录数
 40        protected string description;    //其他描述,及其辅助功能
 41
 42        public int PageSize
 54
 55        public int CurrentPage
 67
 68        public int Pages
 80
 81        public long TotalRecord
 93
 94        public string Description
106
107        public string GUID
128
129        
130
131        public BaseModel()
149
150        public bool MoveNext()
166
167        public bool MovePre()
183
184        public bool GoToRow(int rowIndex)
202
203        public bool GoToFirst()
220
221        public bool GoToLast()
238
239        #region public void Insert()
240        // -----------------------------------------------------------------------------------------
241        /// <summary>
242        /// 插入空行,并把空行当作当前行
243        /// </summary>

244        public void Insert()
245        {
246            Rows.Add(NewRow());
247            index = Rows.Count - 1;
248        }

249        // -----------------------------------------------------------------------------------------
250        #endregion

251
252        public void Delete()
270
271        }

272}

273
结果发现数据在放序列化的时候出错,发现原来是没有加入序列化和反序列化构造函数,虽然BaseModal继承于DataTable,并且加入了[Serializable]树序列化属性,但是要实现想继承序列化,还是要加入构造函数,于是加入:
 1 protected BaseModel(SerializationInfo info, StreamingContext context) : base(info, context)
13
14          #region public override void GetObjectData(SerializationInfo info, StreamingContext context)
15        // -----------------------------------------------------------------------------------------
16        /// <summary>
17        /// 序列化函数
18        /// </summary>
19        /// <param name="info">序列化所需的全部数据</param>
20        /// <param name="context">目标描述</param>

21        public override void GetObjectData(SerializationInfo info, StreamingContext context):base.GetObjectData(info, context)
22        {
23         }

24        // -----------------------------------------------------------------------------------------
25        #endregion

结果编译,没有任何错误,但是类中的属性(pageSize等)值却获取不到,想了很久,发现其实道理跟前面有些类似,因为自己加入的属性根本就没有“告诉”序列化函数去处理,自然而然值就丢失了,于是修改函数如下:
 1 #region protected BaseModel(SerializationInfo info, StreamingContext context) : base(info, context)
 2        // -----------------------------------------------------------------------------------------
 3        /// <summary>
 4        /// 反序列化构造函数
 5        /// </summary>
 6        /// <param name="si">反序列化所需的全部数据</param>
 7        /// <param name="context">目标描述</param>

 8        protected BaseModel(SerializationInfo info, StreamingContext context) : base(info, context)
 9        {
10            index = info.GetInt32("index");
11            pageSize = info.GetInt32("pageSize");
12            currentPage = info.GetInt32("currentPage");
13            pages = info.GetInt32("pages");
14            totalRecord = info.GetInt64("totalRecord");
15            description = info.GetString("description");
16        }

17        // -----------------------------------------------------------------------------------------
18        #endregion

19
20          #region public override void GetObjectData(SerializationInfo info, StreamingContext context)
21        // -----------------------------------------------------------------------------------------
22        /// <summary>
23        /// 序列化函数
24        /// </summary>
25        /// <param name="info">序列化所需的全部数据</param>
26        /// <param name="context">目标描述</param>

27        public override void GetObjectData(SerializationInfo info, StreamingContext context)
28        {
29            info.AddValue("index", index);
30            info.AddValue("pageSize", pageSize);
31            info.AddValue("currentPage", currentPage);
32            info.AddValue("pages", pages);
33            info.AddValue("totalRecord", totalRecord);
34            info.AddValue("description", description);
35            base.GetObjectData(info, context);
36        }

37        // -----------------------------------------------------------------------------------------
38        #endregion

OK,一切搞定了

你可能感兴趣的:(序列化)