对象序列化与反序列化的常见技术

概要:本文简单阐述了几种对象序列化与反序列化的常见技术,并分析了其优缺点。  希望对您的编程有一定的借鉴。

注意:这里的对象序列化和反序列化是指狭义的对象信息的序列化和反序列化,不包括使用数据库技术实现的大数据量的序列化和反序列化技术。

对象的序列化和反序列化技术从计算机出现就是一个重要的技术,经过不断的演变,已经产生了三种常见类型的技术。

关键信息还原

老实说我想了很久也没有想出一个贴切的名字,INI、注册表或一些XML配置(诸如.NET 1.0的config文件)都可以归纳到这种类型,他们表现的特征是:

    - 信息的配置项和对象没有必然的一一对应项;

    - 信息的读取和保存需要自己编程解释;

    - 只有对象的关键信息才被保存和还原。

例如,注册表中包含一个窗体大小的信息,你的程序在启动时需要读取这个信息,并自行将这个信息赋值给窗体对象。在窗口关闭时,自行检索窗口大小并写入注册表。典型的代码:

this.Size = StringToSize(Config.Item[“FormSize”]);

可以看出这种方式是十分初级的序列化和反序列化,当要存储的信息数量不多时,它实现非常的简单,但当配置项变的非常多时将是个噩梦。

实体序列化和反序列化技术

这种方式我认为是当今比较“标准”的序列化和反序列化技术。.NET的二进制序列化、XML序列化技术和.NET 2.0新的配置系统都属于这类。他们的特征是:

    - 存在明显的按照一定规范设计的实体对象,并使用通用的引擎进行序列化和反序列化;

    - 信息被归纳到一个实体中整体看待;

    - 信息的还原度很高。

例如,你可以在一个类上标记序列化标志,然后使用二进制序列化引擎序列化或反序列化,典型的实体代码是:

sealed class FormSettings : ApplicationSettingsBase

{

[UserScopedSettingAttribute()]

public String FormText

{

get { return (String)this["FormText"]; }

set { this["FormText"] = value; }

}

这种方式基本上能够适应绝大多数的任务,但他也有缺点:配置信息是被解释的,所以他理论上是个有限集,你考虑到多少,用户就只能做到多少。于是,新的技术最近几年越来越受到重视:

代码序列化和反序列化技术

这是在上一种方式基础上更加复杂的一种实现技术,他使用源代码描述配置信息,在需要反序列化时编译或解释这段源代码,一般是最终又还原一个对象。事实上,你天天都在用这个技术,这就是Visual Studio .NET的窗体设计器。他表现为:

    - 通常仍然是检索属性来创建序列化的代码,当然,比起实体序列化这种技术要复杂几十倍;

    - 可以包含适当的逻辑在序列化信息中;

    - 信息的还原度非常高。

目前我看见Developer Express 公司的最新报表系统就是使用了相同的技术实现报表信息的序列化和反序列化(内部就是使用MS公开的引擎)。这种技术我认为对于高端应用具有非常好的前景,同时他的高门槛也造就他不可能在普通应用中广泛使用。

原文地址:https://www.cnblogs.com/tansm/p/553127.html