ADO.NET对象串行的实现方法

这篇文章主要讲解了“ADO.NET对象串行的实现方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ADO.NET对象串行的实现方法”吧!

学习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数据,因此即使当输出流是二进制的时,***的输出结果仍然会很大。

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

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

感谢各位的阅读,以上就是“ADO.NET对象串行的实现方法”的内容了,经过本文的学习后,相信大家对ADO.NET对象串行的实现方法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!