Serializing - 序列化 综述 – To be continued.

What is serialize?

这个翻译非常无趣. 就好比有人给你一个英文单词"goooooooood",然后中文翻译就是"古德". 最后打破沙锅问到底,才知道"古德"的意思就是,很好(好连续发音)的意思. 照我看来,序列化也是一个模式的翻译. 这么写当然是为了替自己很多年都没弄清楚这个概念而把原因推到别人身上,哈哈.
英文辞典里serialize有两个解释:1,publish or broadcast(a story or play) in regular installments 2. arrange(something) in a series. 显然计算机术语是延伸了第一个意思,但是story变成了object, 对象而已. publish对象?

Why serialize?

Wikipedia:

In computer science, in the context of data storage and transmission, serialization is the process of converting an object into a sequence of bits so that it can be persisted on a storage medium (such as a file, or a memory buffer) or transmitted across a network connection link. When the resulting series of bits is reread according to the serialization format, it can be used to create a semantically identical clone of the original object. For many complex objects, such as those that make extensive use of references, this process is not straightforward.

所以所谓序列化的目的: 持久化(persist)对象以便存储到某处(文件,缓存等等),或者用来在网络间传输.

How it works?

持久化就是把对象转化成有序的bits,然后接收方或者稍后从存储中读出来在反序列化(deserialize)得到原先的对象

序列化的好处是提供了:

方便的持久化对象, 也提供了一种实现远程调用的方法, 也是一种实现分布式对象的方法,尤其是在corba com这样的环境下, 也提供了一种探测随时间变化的对象状态的方法

.net里头,可以使用Serializeable attribute标识class为可序列化对象.如:

[Serializable]
class Employee

 

 

如果后续该class的版本增加新的方法,可以用OptionalField attribute来实现序列化的兼容性. 同时.net提供了SaopFormatter和XmlSerializer来支持可读性强的跨平台的XML序列化方法,也就是说,序列化的结果不是Binary,而是一个XML File.

Customize Serialize

有时候我们希望可以控制序列化的过程。例如上面提到的版本控制,或者对于其中某个属性进行一些加工处理。其实个人感觉这样的情形并不多见,不过还是有滴。这时候就需要自己来实现序列化的过程。

Traditional Method

传统方式就是实现ISerialzable接口,其中包含了一个函数GetObject。函数中的SerializationInfo类包含了一组Key/Value的数据结构,对应的就是你的变量名和值。因此通常的实现方式如下,注意用这种方式你可以自定义key名,另外如果你只是想存储对象而不需要反序列化的话,还可以添加别的自定义信息:

Code

这是第一步,为了实现反序列化,你需要自定义一个构造函数,参数跟GetObject一样,不同的是这回你是要取值并赋值给自己的对象了。

Code

Recommend Method

微软推荐的”The best practice and easiest way”,是采用类似Event的方式。但是实现同样用Attribute实现,非常简便。这几个attribute分别是:OnSerializedAttribute OnSerializingAttribute OnDeserializedAttribute OnDeserializingAttribute. 这个没什么好讲的,熟悉.NET的同学看字面意思就应该知道怎么起作用的。看微软的示例代码,注意78行被标注为[NonSerialized()]的成员也可以被重写:

Code

Binary, Soap, XML Serialize

标准的序列化是Binary格式的,用BinaryFormatter实现。后来随着对可读性以及兼容性等等需求的出现,尤其是Web Service的兴起,SoapFormatter开始出现。但是这两个的工作原理都一模一样,无非是换了一个Formatter而已。前者性能高,后者兼容性好,可读性强。

这两者在Remoting中起着重要的作用。然而其实平时就算不做Remoting也可以用到相应的概念。尤其是XML出现以后,很多mini程序开始采用XML格式替代数据库来进行数据存储。当然,你可以用XPath之类的东西一个一个的读呀写呀,不过或许,你也想过,能不能就像序列化一样处理对象呢?比如,blog程序中用户发了一篇帖子,我的Post对象就直接序列化成文件呢?答案是有。

Remoting & Serialize

posted @ 2009-07-28 19:02  痘痘熊  阅读(1215)  评论(4编辑  收藏  举报