在学习mybatis中缓存部分有提到序列化这一词,探索一下什么时候应该实现序列化接口,而什么时候可以不实现序列化接口
1. Serializable作用是是实现将后台数据对象转化为字节流传输,一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,将数据分解成字节流,以便存储在文件中或在网络上传输。现在需要将一个对象返回给前端,一般就需要实现 Serializable接口,并提供一个默认的serialVersionUID,因为这时我们需要将后台数据对象转化为便于网络传输的字节流,这时就需要实现Serializable接口,同时还需要serialVersionUID做一个校验才行。
2. 如果一个对象进行序列化跟实现Serializable有关系的话,那么序列化的过程中一定就会调用该对象下的writeObject(java.io.ObjectOutputStream s) ,因此只需启动程序调用接口,在方法writeObject上打断点,看是否可以拦截住。这里使用HashSet做实验。会发现断点没有停住。说明使用SpringMVC框架返回给前端的对象无需实现Serializable接口。因此真正与网络传输打交道的是SpringMVC转换后的json字符串,实体对象与网络并没用直接的接触,所以这里的实体对象无需实现Serializable接口。
序列化的有如下特点: 如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。
什么时候使用序列化: java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。
一般来说如果你的对象需要网络传输或者持久化 (对象直接转换为字节的形式传输),那么就需要实现Serializable接口。比如远程方法调RPC (Remote Procedure Call) 则接口参数就一定要实现Serializable接口;如果只是转换为json字符串的形式与网络打交道,那么就不需要实现Serializable接口。
在我们上面学到的缓存知识中,不论是一级缓存,还是二级缓存,还是ehcache,还是redis,这些缓存的实现过程中都使用了可读写缓存,这时可以实现序列化接口,这样更便于字节流的传输。
UserMapper.xml 添加了二级缓存配置,增加<cache />元素,对应的就让 SysUser 对象实现 Serializable 接口:如下所示
UserMapper.xml :
<mapper namespace="com.example.simple.mapper.UserMapper">
<cache-ref namespace="com.example.simple.mapper.RoleMapper"/>
<cache
eviction="FIFO"
flushInterval="6000"
size="512"
readOnly="false"/>
<!-- 其他代码-->
SysUser.java:
public class BaseException extends RuntimeException {
private static final long serialVersionUID = -997101946070796354L;
/**
* 错误编码
*/
protected String code;
public BaseException() {}
public BaseException(String message) {
super(message);
}
public BaseException(String code, String message) {
super(message);
this.code = code;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
这样一来,就实现了Serializable序列化。