技术开发 频道

Remoting系列之自定义序列化类

IT168 技术文档】

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

文件描述 修改记录修改记录 using System; using System.Data; using System.Text; using System.Runtime.Serialization; namespace Colorful.Model { /**//// <summary> /// 数据基本表 /// </summary> [Serializable] public class BaseModel : DataTable { protected int index; //记录当前行 protected int pageSize; //每页记录数 protected int currentPage; //当前页码 protected int pages; //总页数 protected long totalRecord; //总记录数 protected string description; //其他描述,及其辅助功能 public int PageSizepublic int PageSize public int CurrentPagepublic int CurrentPage public int Pagespublic int Pages public long TotalRecordpublic long TotalRecord public string Descriptionpublic string Description public string GUIDpublic string GUID public BaseModel()public BaseModel() public bool MoveNext()public bool MoveNext() public bool MovePre()public bool MovePre() public bool GoToRow(int rowIndex)public bool GoToRow(int rowIndex) public bool GoToFirst()public bool GoToFirst() public bool GoToLast()public bool GoToLast() public void Insert()public void Insert() public void Delete()public void Delete() } }

    结果发现数据在放序列化的时候出错,发现原来是没有加入序列化和反序列化构造函数,虽然BaseModal继承于DataTable,并且加入了[Serializable]树序列化属性,但是要实现想继承序列化,还是要加入构造函数,于是加入:

protected BaseModel(SerializationInfo info, StreamingContext context) : base(info, context)protected BaseModel(SerializationInfo info, StreamingContext context) : base(info, context) public override void GetObjectData(SerializationInfo info, StreamingContext Context)public override void GetObjectData(SerializationInfo info, StreamingContext context)

    结果编译,没有任何错误,但是类中的属性(pageSize等)值却获取不到,想了很久,发现其实道理跟前面有些类似,因为自己加入的属性根本就没有“告诉”序列化函数去处理,自然而然值就丢失了,于是修改函数如下:

protected BaseModel(SerializationInfo info, StreamingContext context) : base(info, context)protected BaseModel(SerializationInfo info, StreamingContext context) : base(info, context) public override void GetObjectData(SerializationInfo info, StreamingContext context)public override void GetObjectData(SerializationInfo info, StreamingContext context)



OK,一切搞定了

0
相关文章