当前位置: 首页 > news >正文

RedisSerializer之JdkSerializationRedisSerializer分析

clipboard.png

redis在缓存POJO的时候需要将POJO序列化为byte数组进行存储,spring-data-redis实现了类JdkSerializationRedisSerializer对POJO进行序列化。类图结构如上,主要流程如下:

1.JdkSerializationRedisSerializer类实现接口RedisSerializer类中
byte[] serialize(T t)和T deserialize(byte[] bytes)接口。

2.通过定义SerializingConverter和DeserializingConverter对象,对POJO进行序列化和反序列化。

public JdkSerializationRedisSerializer() {
        this(new SerializingConverter(), new DeserializingConverter());
    }
    

3.对于SerializingConverter,通过定义DefaultSerializer对象并调用serialize(Object object, OutputStream outputStream)方法,对POJO进行序列化操作。

    public SerializingConverter() {
            this.serializer = new DefaultSerializer();
        }

    @Override
    public byte[] convert(Object source) {
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream(1024);
        try  {
            this.serializer.serialize(source, byteStream);
            return byteStream.toByteArray();
        }
        catch (Throwable ex) {
            throw new SerializationFailedException("Failed to serialize object using " +
                    this.serializer.getClass().getSimpleName(), ex);
        }
    }
    
    public class DefaultSerializer implements Serializer<Object> {
    @Override
    public void serialize(Object object, OutputStream outputStream) throws IOException {
        if (!(object instanceof Serializable)) {
            throw new IllegalArgumentException(getClass().getSimpleName() + " requires a Serializable payload " +
                    "but received an object of type [" + object.getClass().getName() + "]");
        }
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        objectOutputStream.writeObject(object);
        objectOutputStream.flush();
    }

}

4.对于DeserializingConverter,通过定义DefaultDeserializer对象并调用deserialize(InputStream inputStream)方法对POJO进行反序列化。

public DeserializingConverter() {
        this.deserializer = new DefaultDeserializer();
    }

@Override
    public Object convert(byte[] source) {
        ByteArrayInputStream byteStream = new ByteArrayInputStream(source);
        try {
            return this.deserializer.deserialize(byteStream);
        }
        catch (Throwable ex) {
            throw new SerializationFailedException("Failed to deserialize payload. " +
                    "Is the byte array a result of corresponding serialization for " +
                    this.deserializer.getClass().getSimpleName() + "?", ex);
        }
    }

public class DefaultDeserializer implements Deserializer<Object> {

    private final ClassLoader classLoader;

    @Override
    @SuppressWarnings("resource")
    public Object deserialize(InputStream inputStream) throws IOException {
        ObjectInputStream objectInputStream = new ConfigurableObjectInputStream(inputStream, this.classLoader);
        try {
            return objectInputStream.readObject();
        }
        catch (ClassNotFoundException ex) {
            throw new NestedIOException("Failed to deserialize object type", ex);
        }
    }

}

5.底层还是通过调用JDK的IO操作ObjectInputStream和ObjectOutputStream类实现POJO的序列化和反序列化。

相关文章:

  • Xcode8 打包ios app,上传APPStore,发布流程 以及证书和配置文件遇到的坑
  • 数据结构与算法 第四次实验报告 图
  • php 验证邮箱的方法
  • centos7 修改默认字符集
  • mybatis的动态sql中collection与assoction
  • OpenStack学习:通过devstack安装openstacke mitaka
  • Nginx配置多个基于域名的虚拟主机+实验环境搭建+测试
  • 微信小程序把玩(二十九)video组件
  • Linux学习之路(一)命令基本格式
  • php查找字符串中第一个非0的位置截取
  • java学习1-环境搭建
  • XML与JSON的区别?各自有哪些优缺点?
  • android手机rootROM下载地址
  • 顶级程序员的心得
  • 多功能PCIE交换机之十:单NT的恢复
  • java多线程
  • Java多线程(4):使用线程池执行定时任务
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Terraform入门 - 1. 安装Terraform
  • TypeScript实现数据结构(一)栈,队列,链表
  • VuePress 静态网站生成
  • 测试开发系类之接口自动化测试
  • 从0实现一个tiny react(三)生命周期
  • 第十八天-企业应用架构模式-基本模式
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 如何编写一个可升级的智能合约
  • 如何解决微信端直接跳WAP端
  • 译有关态射的一切
  • 优秀架构师必须掌握的架构思维
  • FaaS 的简单实践
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • # 达梦数据库知识点
  • ###C语言程序设计-----C语言学习(6)#
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (1)Nginx简介和安装教程
  • (3)选择元素——(17)练习(Exercises)
  • (javascript)再说document.body.scrollTop的使用问题
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (阿里云万网)-域名注册购买实名流程
  • (搬运以学习)flask 上下文的实现
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (超详细)语音信号处理之特征提取
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十)c52学习之旅-定时器实验
  • (转) 深度模型优化性能 调参
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • ..回顾17,展望18
  • .htaccess配置常用技巧
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .Net core 6.0 升8.0
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 使用ajax控件后如何调用前端脚本