实现ADO.NET对象串行方法揭秘

开发 后端
ADO.NET对象是用什么方式被串行起来的,在串行一个DataSet对象时,它将基于XML的 DiffGram表示法保存在缓冲器中,文章有详细的介绍。

学习ADO.NET时,你可能会遇到ADO.NET对象问题,这里将介绍解决方法,在这里拿出来和大家分享一下。只有两个ADO.NET对象是被标记为可串行化的——DataTable和DataSet。.net Framework中的串行化是通过formatter对象来完成的,它们可以将一个对象实例保存到一个二进制或一个SOAP流(stream)中。.NET formatter用Reflection来提取任何必要的信息。然而,如果这个类实现了ISerializable接口,那么.NET formatter就会给接口的方法让步,让它们负责拷贝需要串行化到一个内存缓冲器中的所有的信息。DataTable和DataSet类都通过 ISerializable接口支持串行化。

如果你将一个DataTable或一个DataSet串行到一个二进制(binary stream)中,你应该可以得到非常紧凑的输出结果。虽然你得到的结果文件是最小的,但遗憾的是,它实际上并不小。荒谬的是,你保存到一个二进制的DataSet比你用WriteXML方法保存到XML的同样的DataSet要大很多。

要解释这种情况,我们需要来看看ADO.NET对象是用什么方式被串行起来的。在串行一个DataSet对象时,它将基于XML的 DiffGram表示法保存在formatter的缓冲器中。在串行一个DataTable时,它首先创建了一个临时的DataSet对象,将它定义为它的parent,然后作为一个DiffGram串行起来。

一个DiffGram是一个XML流,它提供了一个DataSet中表和行的有状态的表示法。一个DiffGram文件是很详细的,有些冗长。 DiffGram包含当前的数据,以及被修改的行和未解决的错误的初始值。当我们保存一个DataSet或一个DataTable时,所有这些信息就会被传递给serializer。被串行化的对象总是包含XML数据,因此即使当输出流是二进制的时,***的输出结果仍然会很大。

#T#你可以创建一个继承DataTable或DataSet的新的可串行化的类来解决这个问题,并且更有效地保存ADO.NET对象。你必须用<Serizlizable()>属性来标记新类,即使父类是可以串行化的。实际上,串行性(serizlizability)并不是一个可以自动继承的类属性。你从DataTable或DataSet构建的新类也可以实现ISerializable接口。当然,你可以为新类选择一个不同的串行化方案。一个简单而有效的方法就是将DataTable类的所有成员映射到数组和值成员中(见列表1)。

运用一个派生的类和一个自定义的串行化方案可以为一个DataSet对象节省多达80%的磁盘空间。节省的空间的比率取决于DataSet中的数据类型。你的数据越基于文本,节省的空间越多。然而,运用二进制的BLOB字段只可以节省大约25%的空间(下载一个完整的例子)。

责任编辑:田树 来源: 博客
相关推荐

2009-11-04 10:23:05

ADO.NET Con

2009-11-03 17:12:33

ADO.NET Exe

2009-11-04 16:31:40

ADO.NET Ora

2009-11-04 12:45:33

ADO.NET Dat

2009-11-03 16:37:10

2009-11-03 17:25:59

ADO.NET编程技巧

2009-11-04 10:35:42

ADO.NET Con

2009-10-29 10:34:31

ADO.NET使用技巧

2009-11-04 13:51:46

ADO.NET性能

2009-10-29 13:34:01

ADO.NET对象

2009-11-04 15:55:49

ADO.NET VC

2009-11-04 11:30:35

ADO.NET Dat

2009-12-18 14:27:24

ADO.NET对象

2009-12-28 13:47:31

ADO.NET对象

2009-11-12 16:04:42

ADO.NET对象查询

2009-11-11 09:54:34

ADO.NET Rec

2009-12-21 17:35:24

ADO.NET对象

2009-11-13 14:38:45

ADO.NET Dat

2009-12-21 17:02:19

ADO.NET Sql

2009-11-03 15:24:14

ADO.NET对象模型
点赞
收藏

51CTO技术栈公众号