posts - 122,  comments - 25,  trackbacks - 0

1、什么是java序列化

Java 序列化 API 提供一种处理对象序列化的标准机制。序列化Serialization是指将java对象用一连串字节描述的一个过程;反序列化deserialization是一种将这一串字节构建成一个对象的过程。


2、序列化的作用(必要性)

Java中,一切都是对象,在分布式环境中经常需要将对象从这一端网络或设备传递到另一端。Java 序列化机制就是一种解决在网络两端传输数据的问题而产生的协议。下图表示客户端/服务器之间通信,一个对象是从客户端传送到服务器通过序列化的视图。


3、如何序列化一个对象

为序列化一个对象,你需确保对象类实现Serializable接口。Serializable接口没有方法,只要实现了序列化接口,Class 就能被序列化机制处理。

示例代码,需序列化的java对象:

1 import java.io.Serializable;
2 
3 public class TestClassSerial implements Serializable  {
4     public byte version = 100;
5     public byte count = 0;  
6 }

示例代码,TestClassSerial对照象输出成 Byte 流,存储到 temp.out 文件里:
 1     public static void main(String args[]) throws IOException {
 2         FileOutputStream fos = null;
 3         ObjectOutputStream oos = null;
 4         try {
 5             fos = new FileOutputStream("c:/temp.out");
 6             oos = new ObjectOutputStream(fos);
 7             TestClassSerial tcs = new TestClassSerial();
 8             oos.writeObject(tcs);
 9             oos.flush();
10         }
11         finally {
12             if(oos != null) {
13                 oos.close();
14             }
15             if(fos != null) {
16                 fos.close();
17             }
18         }
19     }

示例代码,从持久的文件中读取 Bytes 重建对象
 1     public static void main1(String args[]) throws IOException {
 2         FileInputStream fis = null
 3         ObjectInputStream oin = null;
 4         try {
 5             fis = new FileInputStream("c:/temp.out");
 6             oin = new ObjectInputStream(fis);
 7             TestClassSerial tcs = (TestClassSerial) oin.readObject();
 8             System.out.println("version="+tcs.version);
 9         }
10         finally {
11             if(fis != null) {
12                 fis.close();
13             }
14             if(oin != null) {
15                 oin.close();
16             }
17         }
18     }

执行结果为:100.


4、对象的序列化格式

TestClassSerial对象序列化输出的 temp.out 文件,以 16 进制方式显示,内容如下:

AC ED 00 05 73 72 00 0A 53 65 72 69 61 6C 54 65
73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05
63 6F 75 6E 74 42 00 07 76 65 72 73 69 6F 6E 78
70 00 64

这些二进制字节就是用来描述序列化以后的TestClassSerial对象的,我们注意到 TestSerial 类中只有两个域:

1 public  byte version = 100;
2 public byte count = 0;

都是 byte 型,理论上存储这两个域只需要 2 byte ,但是实际上 temp.out 占据空间为 51bytes ,也就是说除了数据以外,还包括了对序列化对象的其他描述。


5、Java 的序列化算法

序列化算法一般会按步骤做如下事情:

1、将对象实例相关的类的元数据输出;
2、
递归地输出类的超类元数据描述直到不再有超类;
3、
类元数据完了以后,开始从最顶层的超类开始输出对象实例的实际数据值;
4、
从上至下递归输出实例的数据;


更多序例化事例及二进制字节含义参考文档:http://my.oschina.net/god/blog/1291

posted on 2010-12-16 14:52 josson 阅读(805) 评论(0)  编辑  收藏 所属分类: java 开发

只有注册用户登录后才能发表评论。


网站导航:
 
<2010年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(3)

随笔分类

随笔档案

收藏夹

搜索

  •  

最新评论

阅读排行榜

评论排行榜