扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
本文的目标是用不到140行的C#代码编写一个简单的面向对象的数据库(OODB)。很显然这不会是一个最简单的项目;但是C#和.NET框架提供了很多内置的函数,我们可以利用它们来帮助我们实现这一目标。这个数据库的要求如下:
很显然,企业级OODB的要求会严格得多,而且会有其他的特性,比如索引、触发器和并发等。本文所呈现的(核心思想)是充分利用.NET框架内置的功能就可以创建一个简单的OODB。我们在这里不是要颠覆性地创建一个OODB,而是要显示利用一点点创造力能够实现什么。
如何保存数据
将对象保存在数据库里我们有很多选择。其中最容易想到的一个是使用二进制序列化将其序列化。这让我们能够利用内置的二进制序列化(System.Runtime.Serialization命名空间)的优势,并使得保存/获取对象变得轻而易举。但是如果采取这种方式,我们就不得不需要编写搜索例程来搜索数据了。我们还必须面对对象以及对象类型相互隔离的状况。由于这些限制以及项目目标(的要求),二进制序列化对于我们来说不是最佳的选择。
第二种选择是XML序列化。XML序列化提供了很多二进制序列化的优势,以及一些有趣的功能。与二进制序列化比较起来,XML序列化最大的一个优势是对象保存在XML里。这意味着这些对象的搜索以及对象/对象类型的隔离已经在极大程度上被处理了。由于这些原因,XML序列化就是我们将要在这个项目里使用的方式,它能够满足第1项和第2项要求,并能够让我们轻轻松松就实现其他的要求。
关于XML序列化要知道的一件事情是,它一次只能够序列化/反序列化一个父对象。这意味着我们将需要在同一个文件里用一个XML布局保存多个父对象。这一问题可以通过将StringReader和StringWriter对象当作流而不是对象使用来解决。一旦我们把经过序列化的对象放到字符串里,我们就可以使用一个XmlDocument对象把对象的数据添加到数据库的XML文件里。要获得更多关于XML序列化的信息,请参阅我的XML序列化文章。
一个带有两个Customer(用户)对象的简单数据库看起来就像列表A一样。
列表A
<Database>
<XmlDB.Order>
<Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Identity>76a0558b-a8c7-42e3-8f1d-c56319365787</Identity>
<CustomerIdentity>6f5e9a2b-b68f-4b6d-9298-fbe5f135dd25</CustomerIdentity>
<DatePlaced>2006-11-21T07:12:16.3176493-05:00</DatePlaced>
</Order>
<Order xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Identity>16d8f0b8-46c6-47c3-ac6b-a0b0e0852970</Identity>
<CustomerIdentity>61cf2db4-0071-4380-83df-65a102d82ff2</CustomerIdentity>
<DatePlaced>2006-11-21T07:12:26.0533326-05:00</DatePlaced>
</Order>
</XmlDB.Order>
<XmlDB.Customer>
<Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Identity>6f5e9a2b-b68f-4b6d-9298-fbe5f135dd25</Identity>
<LastName>Cunningham</LastName>
<FirstName>Marty</FirstName>
</Customer>
<Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Identity>61cf2db4-0071-4380-83df-65a102d82ff2</Identity>
<LastName>Smith</LastName>
<FirstName>Zach</FirstName>
</Customer>
</XmlDB.Customer>
</Database>
正如你能看到的,这个格式允许我们快速地分析XML,并找到对象类型的不同分组。
既然我们已经决定用XML序列化来保存对象,那么我们就需要找一种在内存中保存数据的方式,以便可以让用户与其交互。实现这一目标的一个显而易见的选择是XmlDocument类,因为它为XML文件提供了搜索和更新能力。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者