作为java开发人员,都知道序列化的存在,对于一些人来说可能没有真正明白序列化。接下来我们将从以下几个问题去探讨下序列化:什么是序列化?序列化的作用是什么?什么时候应该使用序列化?怎样去实现序列化?
对于序列化的定义,读过《Effective java》的应该知道这段话:对象序列化(object serialization) API提供了一个框架,用来将对象编码成字节流,并从字节流编码中重新构建对象。我们把“将一个对象编码成一个字节流”称作将该对象序列化(serializing);相反处理过程被称作反序列化(desreializing)。通过这段话我们对序列化的定义就比较明确了,简单的来说序列化就是以中国用来处理对象流的机制。在对象被序列化之后,所形成的编码就可以从一台正在运行的虚拟机被传递到另一台虚拟机上,或者被存储到磁盘上。
我们都知道java平台允许我们在内存中创建可复用的对象,但是一般情况下只有jvm运行时对象才存在,也就是说对象的生命周期没有jvm的生命周期长。那么就存在一个问题,如果我们想在jvm停止的情况下去持久化一个对象,并在以后的某个时间去重新获取这个对象那该怎么办?此时就需要序列化的使用。也可以说在以下几个情况下会使用到序列化:1:把内存中的对象保存到另外一个文件或者数据库中的时候;2:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样,也就是RMI传输对象的时候。3:使用套接字在网络上传送对象的时候。
在java中实现序列化的方法也非常简单,只要在声明中加入implements Serializable即可,下面我们来看下对象的序列化:
创建一个area类并序列化:
package com.hcy.entity;
import java.io.Serializable;
public class Area implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private int Id;
private String areaCode;
private String areaName;
private int areaLevel;
private int counryId;
private int provingId;
private int cityId;
private String EXT_ARG0;
private String EXT_ARG1;
private String EXT_ARG2;
public String getAreaCode() {
return areaCode;
}
public void setAreaCode(String areaCode) {
this.areaCode = areaCode;
}
public String getAreaName() {
return areaName;
}
public void setAreaName(String areaName) {
this.areaName = areaName;
}
public int getAreaLevel() {
return areaLevel;
}
public void setAreaLevel(int areaLevel) {
this.areaLevel = areaLevel;
}
public int getCounryId() {
return counryId;
}
public void setCounryId(int counryId) {
this.counryId = counryId;
}
public int getProvingId() {
return provingId;
}
public void setProvingId(int provingId) {
this.provingId = provingId;
}
public int getCityId() {
return cityId;
}
public void setCityId(int cityId) {
this.cityId = cityId;
}
public int getId() {
return Id;
}
public void setId(int id) {
Id = id;
}
public String getEXT_ARG0() {
return EXT_ARG0;
}
public void setEXT_ARG0(String eXT_ARG0) {
EXT_ARG0 = eXT_ARG0;
}
public String getEXT_ARG1() {
return EXT_ARG1;
}
public void setEXT_ARG1(String eXT_ARG1) {
EXT_ARG1 = eXT_ARG1;
}
public String getEXT_ARG2() {
return EXT_ARG2;
}
public void setEXT_ARG2(String eXT_ARG2) {
EXT_ARG2 = eXT_ARG2;
}
}
在我们看起来序列化一个对象很简单,其实不然,实现Serializable接口最大的代价就是一但这个类被发布,就大大降低了改变这个类的实现的灵活性。也就是说如果这个类实现了Serializable接口后,他的字节流编码就变成了他的导出的api的一部分。而且这个类一旦被广泛使用,往往必须永远支持这种序列化形式,就好像你必须要支持导出api的所有其他部分一样。这点就需要自定义的序列化形式,牵涉到序列化的优缺点以及需注意的事项,这块我会在后期在做介绍。