一) 何为
序列化(Serialize)
将Java 对象序列化为
二进制文件的技术称为序列化。
二)何时需要使用到序列化技术
大致三种情况吧:
a)当你想把的
内存中的对象写入到
硬盘的时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
三)Hello, Serialize
话不多说,给个简单
例子:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class SerializeClass implements Serializable {
private static final long serialVersionUID = 1L;
private String name = "thaIm";
private transient String ignoreStr = "ignore";
public static int staticVar = 5;
public static void main(String[] args) {
try{
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("result.obj"));
out.writeObject(new SerializeClass());
out.close();
SerializeClass.staticVar = 10;
ObjectInputStream oin = new ObjectInputStream(new FileInputStream("result.obj"));
SerializeClass sc = (SerializeClass) oin.readObject();
oin.close();
System.out.println(sc.getName()+"=="+sc.getIgnoreStr()+"=="+SerializeClass.staticVar);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public void setIgnoreStr(String ignoreStr) {
this.ignoreStr = ignoreStr;
}
public String getIgnoreStr() {
return ignoreStr;
}
}
程序的输出结果: thaIm==null==10
和你想的一样么?
四)serialVersionUID
如果你第一次接触java序列化,可能会对以上代码中的serialVersionUID字段很好奇。这看似多余的东西到底有何用途呢?且听我娓娓道来~~
情境:两个客户端 A 和 B 试图通过网络传递对象数据,A 端将对象 C 序列化为二进制数据再传给 B,B 反序列化得到 C。
实现条件: A B 两个客户端SerializeClass类有相同的:
1)类路径 2)功能代码 3)序列化ID,即serialVersionUID
而之所以要增加序列化ID一致这个条件,是因为它的存在对于代码的
版本控制,代码安全都有不小的好处。
五)多说几句
1)
关键字transient,它可使字段避免被序列化,反序列化时该字段取默认值(比如String的话就为null,int的话为0) 上述例子中 private transient String ignoreStr = "ignore";说明了该情况。
2)static 字段不会被序列化。原因也很简单,它是类的变量,不是某个实例的变量。注意上述例子中的语句 SerializeClass.staticVar = 10;
3)序列化存储规则。 对同一对象两次序列化入文件,
第二次的序列化将只新增引用信息,以引用第一次序列化的对象。这样做不但可以保证反序列化后两个对象==,而且还能节省不少磁盘空间。是个非常不错的序列化规则哦!