什么是序列化,有什么用?
官方说 : 序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.
在序列化期间,对象将其当前状态写入到临时或持久性存储区 . 以后 ,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象.通俗上说 : 序列化就是可以将内存中Java对象可以写在硬盘上(序列化到硬盘上) , 反序列化就是将硬盘的内容读取到内存中;
Java是通过实现Serialization接口 ,实现的序列化. 注 : Serialization接口里面没有方法,就是个标识接口.
通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。
序列化的条件是什么?
该类必须实现 java.io.Serializable 接口。
该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的。
既然实现序列化,那什么是serialVersionUID?
SerialVersionUID是一个标识符,当它通常使用对象的哈希码序列化时会标记在对象上。
我们可以通过Java中serialver工具找到该对象的serialVersionUID。
SerializableID 号是根据类的特征和类的签名算出来的。
Serializable 是用于判断类和对象是否是同一个版本。
如果可序列化类未显式声明 serialVersionUID,则序列化运行时将基于该类的各个方面计算该类的默认 serialVersionUID 值。原因是计算默认的 serialVersionUID 对类的详细信息具有较高的敏感性,根据编译器实现的不同可能千差万别,这样在反序列化过程中可能会导致意外InvalidClassException。
怎么实现序列化操作?
- 序列化操作(ObjectOutputStream(序列化流))
/**
* 序列化保存USer 对象
* User user = new User(username,password,phonePackage,recharge,telephone);
* //序列化保存
* userService.saveUser(user);
*/
public void saveUser(User user){
File folder = new File("d:"+File.separator+"兜兜项目");
if(!folder.exists()) folder.mkdir();
File file = new File(folder,user.getTelephone());
try(ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(file))){
file.createNewFile();
os.writeObject(user);
}catch (Exception e){
e.printStackTrace();
}
}
- 反序列化(ObjectIntputStream(反序列化流))
/**
* 反序列化 查询用户信息
* 根据手机号查询
* 返回user
*/
public User finduser(String telephone){
File folder = new File("d:"+File.separator+"兜兜项目");
if(!folder.exists()) folder.mkdir();
File file = new File(folder,telephone);
if(!file.exists()) return null;
try(ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file))) {
file.createNewFile();
return (User) ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
总结
一、使用序列化一定要实现Serialization接口
二、使用序列化步骤:1. 创建序列化流 2. 调用 writeObject 方法, 写对象 3. 释放资源.
三、使用反序列化步骤: 1. 创建 ObjectInputStream 反序列化流 2. 调用 readObject 方法,读对象 3. 释放资源。
四、如果某个类能够被序列化,其子类也可以被序列化.
五、声明为static和transient类型的成员数据不能被序列化. 因为static代表类的状态, transient代表对象的临时数据。
六、java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。