序列化指的是将程序里的东西从内存储存到硬盘里,以便保存和传输。
java的io也提供了序列化,被序列化的javabean只需实现这个接口:java.io.Serializable。
什么是javabean呢?总的来说,就相当于一个仓库,里面的变量可以取出和设置,但是不能直接访问变量。因此,javabean要符合下列条件:
1.javabean需要给每一个变量提供public
的getter和setter。
2.javabean里的变量应为private
。
3.如果javabean需要被序列化,那么应实现java.io.Serializable接口。
例如下列就是一个可被序列化的javabean:
import java.io.Serializable;
class User implements Serializable{
private String username, password;
public User(){}
public User(String username, password){
this.username = username;
this.password = password;
}
public void setUsername(String username){
this.username = username;
}
public String getUsername(){
return this.username;
}
public void setPassword(String password){
this.password = password
}
public String getPassword(){
return this.password;
}
}
当然,很多人有疑问:java.io.Serializable
是什么?为什么要实现它?现在让我们来看一看他的接口:
是个空接口?我们不用计较。先来看一看怎样写入磁盘(序列化)和读磁盘(反序列化)。
想要序列化和反序列化,就要用到java.io
,只不过不是写文本文件了,而是直接写入Object的二进制。具体方法还是看下边:
这回,方法变成了
readObject()
和writeObject()
。
如果没有实现这个接口的话,写的过程会直接报错,说你没有实现那个接口,不过那也就是一个标志性接口,实现就可以了。
还有,javabean需要一个serialVersionUID,在eclipse会提示你新建一个,这个serialVersionUID作用很大,因为它相当于记录着文件最后被编辑的一个东西,如果你不定义他的话,能用是能用,但是如果你对JavaBean有一点改动,反序列化的时候就会报错,因为JVM会认为编辑了一下,之前序列化后的就不兼容了。解决方法就是把serialVersionUID定义为1L。比如这样:
这个工具怎么用呢?当然是直接新建它的对象,然后序列化或反序列化。反序列化的时候,需要强转成你创建的javabean。
即使是二进制,不过他的变量是英文的话就会直接存储(中文会乱码),用记事本打开还能看到,因此不要想着用序列化就可以保密了。