与DotNet数据对象结合的自定义数据对象设计 (二) 数据集合与DataTable
2008-04-13 15:05
309 查看
在上篇Blog中介绍了如何定义一个与DataRow相结合的数据类,那么本篇将介绍如何定义一个与DataTable对应的数据集合。
在DotNet中提供了一个CollectionBase作为我们定义强类型的数据集合的抽象类,在DotNet1.1中要定义一个强类型的数据集合就必须为每一种数据类定义一个对应的数据集合,在2.0中增加了泛型的功能后,这个问题得到了解决。又由于在目前的Ibatisnet版本中还不支持泛型的功能,所以数据集合可以选择从ArrayList或CollectionBase继承下来。但是不管是ArrayList还是CollectionBase都不支持序列化,也是他们都有没有Serializable属性,那么实现的数据集合也将无法实现序列化,所以这边选择直接实现IList接口,内部再实例化一个ArrayList做为数据容器。类的定义如下:
public class ObjectList : IList, ISerializable{}
还有一需要解决的问题是,数据类如何与DataTable对应起来呢?在数据类定义一个DataTable的属性和内部变量,做为存储数据的容器。
1private DataTable m_dataTable = null;
2 public DataTable DataTableForm
7
因为前面有提到了,一个对象对应一个DataRow,当前一个对象单独存在时,它的数据存放在数据类的数据容器里,而当中被加到一个集合里时,数据行就应该存放在数据集合对应的DataTable里了。那要怎么转换呢?很简单,只需要把数据行从原来(数据类的数据容器)的表里面复制到ObjectList对应的DataTable里,然后将原来的行删除就行了。这里复制一行数据也是有学问的,因为一个DataRow一旦创建了,它就只能被加入到创建它的那个DataTable里,当它被加入到另外一个表里就会抛出它同时只能属于一个表的异常,而如果是DataRow里的数据一列一列地复制到另一个DataRow,就会对性能造成非常大的影响。最理想的办法就是数据不动,只改变DataRow记录的一个状态信息就行了。这里的改变行状态的办法就是NewRow,而数据不动的办法就是将源Row的ItemArray属性赋值给目的的ItemArray。经过测试,这样做可以减少1倍以上的时间成本(内存成本也一样)。
具体的添加方法如下:
同时增加一个反序列化的构造函数
1protected ObjectList(SerializationInfo info, StreamingContext context) : base()
2
这样就可以支持序列化与反序列化了。
整个数据类的定义如下:
1[Serializable]
2 public class ObjectList1 : IList, ISerializable
3private void AddObjectRowToListTable(IDataObject p_dataObject)
2
下一个就是序列化的问题了。序列化集合类好像比较麻烦,因为它本身并没有为我提供支持序列化的方法。而在这个数据集合里,实现了ISerializable接口,由我们自己来定义要序列的方式。我们的关键是序列化数据,所以就这里的序列化就只需要序列ObjectList对应的DataTable就行了。实现ISerializable接口如下:
1public void GetObjectData(SerializationInfo info, StreamingContext context)
2
在DotNet中提供了一个CollectionBase作为我们定义强类型的数据集合的抽象类,在DotNet1.1中要定义一个强类型的数据集合就必须为每一种数据类定义一个对应的数据集合,在2.0中增加了泛型的功能后,这个问题得到了解决。又由于在目前的Ibatisnet版本中还不支持泛型的功能,所以数据集合可以选择从ArrayList或CollectionBase继承下来。但是不管是ArrayList还是CollectionBase都不支持序列化,也是他们都有没有Serializable属性,那么实现的数据集合也将无法实现序列化,所以这边选择直接实现IList接口,内部再实例化一个ArrayList做为数据容器。类的定义如下:
public class ObjectList : IList, ISerializable{}
还有一需要解决的问题是,数据类如何与DataTable对应起来呢?在数据类定义一个DataTable的属性和内部变量,做为存储数据的容器。
1private DataTable m_dataTable = null;
2 public DataTable DataTableForm
7
因为前面有提到了,一个对象对应一个DataRow,当前一个对象单独存在时,它的数据存放在数据类的数据容器里,而当中被加到一个集合里时,数据行就应该存放在数据集合对应的DataTable里了。那要怎么转换呢?很简单,只需要把数据行从原来(数据类的数据容器)的表里面复制到ObjectList对应的DataTable里,然后将原来的行删除就行了。这里复制一行数据也是有学问的,因为一个DataRow一旦创建了,它就只能被加入到创建它的那个DataTable里,当它被加入到另外一个表里就会抛出它同时只能属于一个表的异常,而如果是DataRow里的数据一列一列地复制到另一个DataRow,就会对性能造成非常大的影响。最理想的办法就是数据不动,只改变DataRow记录的一个状态信息就行了。这里的改变行状态的办法就是NewRow,而数据不动的办法就是将源Row的ItemArray属性赋值给目的的ItemArray。经过测试,这样做可以减少1倍以上的时间成本(内存成本也一样)。
具体的添加方法如下:
同时增加一个反序列化的构造函数
1protected ObjectList(SerializationInfo info, StreamingContext context) : base()
2
这样就可以支持序列化与反序列化了。
整个数据类的定义如下:
1[Serializable]
2 public class ObjectList1 : IList, ISerializable
3private void AddObjectRowToListTable(IDataObject p_dataObject)
2
下一个就是序列化的问题了。序列化集合类好像比较麻烦,因为它本身并没有为我提供支持序列化的方法。而在这个数据集合里,实现了ISerializable接口,由我们自己来定义要序列的方式。我们的关键是序列化数据,所以就这里的序列化就只需要序列ObjectList对应的DataTable就行了。实现ISerializable接口如下:
1public void GetObjectData(SerializationInfo info, StreamingContext context)
2
相关文章推荐
- 与DotNet数据对象结合的自定义数据对象设计 (二) 数据集合与DataTable
- 与DotNet数据对象结合的自定义数据对象设计 (二) 数据集合与DataTable
- 与DotNet数据对象结合的自定义数据对象设计 (一) 数据对象与DataRow
- 与DotNet数据对象结合的自定义数据对象设计(IBatisNet)
- 与DotNet数据对象结合的自定义数据对象设计 (一) 数据对象与DataRow
- 基于数据访问的集合类型-领域驱动设计的又一种特定对象
- 向集合中存储自定义对象是,自定义对象的设计
- ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用 ASP.NET MVC 学习笔记-3.面向对象设计原则
- 对自定义对象集合List中的数据进行排序
- 集合对象与自定义javabean对象接收数据库查询的数据 (基础知识扫盲)
- 自定义UserControl中包含封装了集合对象的属性被设计器自动初始化所引起的错误
- java:retainAll获取俩个自定义实体对象集合的重叠数据
- 对于集合内装载的对象数据进行自定义排序 !
- handlebars获取json数据(集合对象)及各种自定义helper数据格式化工具
- 自定义的数据集合对象的自定义排序和显示
- 使用Object对象的toString()方法自定义判断数据类型方法
- .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)
- 原型设计模式prototype-构造js自定义对象
- 集合类中HashSet存储自定义对象
- HashSet 集合存储自定义对象并遍历