Fork me on GitHub

Serializable序列化用法

在学习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序列化。

posted @ 2021-01-07 12:03  叶语婷  阅读(305)  评论(0编辑  收藏  举报