Java基础:序列化的作用      
View on GitHub

龙珠

修炼自己与发现世界

Java基础:序列化的作用

By arthur503 -- 29 Oct 2013

看hadoop的时候,看到将数据序列化后用于进程间通信。不清楚为什么需要序列化才进行进程间通信,其他的方法不好么?

查了下资料,在c#的序列化究竟有什么用?中楼主也是相同的问题。

请大家看网上的这段话:

序列化和反序列化最主要的作用有:“把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 ”

上面是网友对c#序列化作用的解释,我怎么看不出来序列化有什么用呢?我自己的编写一个小程序,用c#的文件操作类也可以保存对象> 的数据啊,还要序列化做什么?

我的问题是:既然用c#的文件操作类也可以保存对象的数据,还要序列化做什么?另外,通过其他办法也可以实现网络间通信和进程间通信,那为什么非要序列化呢?序列化和传统的手段相比究竟有什么好处? 奥术引擎说“数据需要序列化以后才能在服务端和客户端之间传输”,这是不对的,难道别的方法就不能传输了吗?

回答如下:

序列化是用来通信的,服务端把数据序列化,发送到客户端,客户端把接收到的数据反序列化后对数据进行操作,完成后再序列化发送到服务端,服务端再反序列化数据后对数据进行操作。说白了,数据需要序列化以后才能在服务端和客户端之间传输。这个服务端和客户端的概念是广义的,可以在网络上,也可以在同一台机器的不同进程中,甚至在同一个进程中进行通信。在传统编程中,对象是通过调用栈间接的与客户端交互,但在面向服务的编程中,客户端永远都不会直接调用实例。不知道说的明不明白。

好吧,我说的确实不够明白,你问的是为什么需要序列化,我只是说了序列化的一个应用。那我就来说说序列化的好处吧。不序列化也可以传输,但是无法跨平台,安全性也无法保障。我说的是面向服务编程中的作用,在传统编程中,你在表示层实例化一个业务对象,然后调用业务对象中的方法,你想过为什么能这样调用吗?这样做耦合度太高,很不好。如果序列化以后通过特定的协议传输数据就不一样了,表示层通过代理或通道向服务层发送特定的数据格式,这个数据就是序列化以后的,比如XML,服务端接收到以后要进行反序列化,生成服务端可识别的数据格式,比如一个类,然后对数据进行操作,再序列化发送到客户端,客户端再反序列化。这样客户端可以使用和服务端完全不同的开发平台,只要它能够对xml数据进行反序列化,而xml是具有工业标准的数据格式,基本各平台都支持。这也适用于在进程间通信。如果在进程内通信,也可以做到更高的安全性,对象不再通过调用栈交互,而是通过代理或通道。

另外,在Hadoop深入学习:InputFormat组件中讲到InputSplit的作用时说:

InputSplit主要有以下特点:

1)、逻辑分片,之前我们已经学习过split和block的对应关系和区别,split只是在逻辑上对数据分片,并不会在磁盘上讲数据切分成split物理分片,实际上数据在HDFS上还是以block为基本单位来存储数据的。InputSplit只记录了Mapper要处理的数据的元数据信息,如起始位置、长度和所在的节点;

2)、可序列化,在Hadoop中,序列化主要起两个作用,进程间通信和数据持久化存储。在这里,InputSplit主要用于进程间的通信。

参考资料: