论对象序列化

来源:互联网 发布:大数据收集 编辑:程序博客网 时间:2024/06/06 10:49

 

对象序列化是几乎所有的应用程序开发者都必然面临的问题。当我们修改了Windows的某项配置,保存了自己辛苦创建的Word文档,在论坛上发表了某篇帖子,或是发送了一封Email, 我们在进行着文档序列化的操作。

在一个程序员看来,文档的序列化方式,决定了一个应用程序的整体架构,也决定了软件中看到80%以上代码的形态。因为软件就是处理数据的,80%以上用户关心的数据都是要存储的。存储的方式决定了对象的建模,也就决定了操作对象的代码。

现在让我们逐个看看常见的几种对象序列化方式。

 

1. 从fopen(fname, "wb") 开始的对象序列化

毫无疑问,这种是最原始的对象序列化方式,对于存储一个结构体最方便不过了。 比如:

struct Config
{
    int param1, param2;
    char param3[10];
} config;

fwrite(fp, &config, 1, sizeof(Config));

这种方式的好处是显而易见的,简单,快速,明了,但是应用范围非常局限,对于比较复杂的对象(比如有大量对象间引用的情况)难以处理。

2. 基于文本解析

目前使用文本文档保存数据的应用程序还是挺多的。另外如果是简单的配置信息,使用INI文件是一种最常见的办法了。这种方式的加载数据的过程常常会比较漫长, 加载程序的逻辑常常比较复杂(水平不高的程序员还真不敢写)。他的好处是在离开GUI环境的时候,我们也可以很容易的对文件信息进行编辑。我以前很喜欢打的《决战坦克》的地图就是用这种方式保存的。

Title="Sky World"

Description="Be careful of the smooth ice!"

Width=80

Height=60

Data=0,0,0,4,6,..........

现在随着 XML 的广泛使用,XML 这种方式的数据存储也得到了跟广泛的应用,而且XML解析库通常功能强大,因此程序员不用担心自己的解析代码有bug, 也不用痛苦的写解析代码了。

3. 基于数据库

我们这里讲的数据库是指关系数据库。做Web开发的人应该对这种对象存储方式再熟悉不过了。这种方式一般会将对象的成员信息映射到数据库的字段,对象的间的相互引用如聚合,组合则通通使用外键引用来实现。通过对数据库添加各种约束,可以很好的保证对象的完整性。

关系数据库是现在软件开发的大红人,关系数据库的理论也是发展的博大精深,于是关系数据库的产品也都是体现庞大复杂。据说现在有一定工作经验的oracle dba的年薪都在30W以上(这是我一个准备做Oracle DBA的同学亲口告诉我的)。显然比写MFC C++代码来钱快得多。无论如何,这种应对的是海量的数据。数据的存储方式相当复杂。

由于欠缺经验,我只能说我所接触的基于数据库的软件,大多都是基于ASP访问Acess或者SQL Server的程序。更加高明的php或者java EE 程序员会使用很多"持久化框架", 并且"缓存数据库连接". 在我大二的时候做学校的网站时,代码里面充满了:

strSql=“select × from table where id=" & id

obj.member=rs["membername"]

这样的代码。

现在的很多开发工具都会有包装类生产器的功能。可以根据数据库中的表信息或者对象定义来产生一个针对特定编程语言的“包装类”。但是,我记得在我大四的时候做TopCoder的组件时,还是在使用拼凑SQL语句的做法。只不过那时候使用了参数化SQL.

4. 面向对象的存储系统

面向对象的存储系统其实和对象数据库通常是一起提的。两个主要原因让用户使用对象数据库技术。首先,关系数据库在管理复杂数据时显得笨重。其次,被应用软件操作的数据一般是用面向对象的编程语言如 C++, Java, Delphi和 C# 写成,而那些用来转化数据表示和关系数据库元组的代码很冗繁,执行时也有不少耗时。

面向对象的数据库省略了将数据从编程语言向数据表转换的过程,比如下面的代码:

documentObject* pObj=persisted_new documentObject();

// Now the object has been allocated into a memory that'll be persisted

或者这种形式:

// Populate the root object in the document

....

db.WriteObject(pRootObject);

一般来说,如果使用的是C++,那么可能会需要在class定义中加入一些宏来定义序列化相关的东西,或者注册meta data, 等等。在C#, java等支持反射的编程语言中,无需任何额外的努力,面向对象的数据库可以直接存储应用程序对象。

面向对象数据库的吸引力是明显的:

1. 大大提高开发效率 - 不用写转换的代码了

2. Join table, create index等等在关系数据库中维护对象间引用的工作都可以省了,代之以直接用指针获得这一高效的方式。

 

但是,目前的对象数据库由于未成气候,功能千差万别,有些甚至实现了SQL查询,备份,查询等等相当高级的数据库管理功能。有些只具有基本的指针恢复功能。但无论如何,面向对象数据库是未来数据库发展的方向,如果微软某一天推出一款对象数据库,对象数据库一定会变成下一个大红人的。

http://www.cetus-links.org/oo_db_systems_1.html

原创粉丝点击