baby sword‘s blog baby sword‘s blog
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)

zhengjian

不敢承担失去的风险,是不可能抓住梦想的
首页
  • java基础
  • java进阶
大数据
  • mysql

    • mysql索引
    • mysql日志
  • redis

    • 单机下的redis
    • 集群下的redis
  • Spring
  • springboot
  • RPC
  • netty
  • mybatis
  • maven
  • 消息队列
  • kafka
  • zookeeper
  • rocketmq
  • 七大设计原则
  • 创建型模式
  • 结构型模式
  • 行为型模式
  • SpringCloud

    • eureka
  • SpringCloud Alibaba

    • nacos
  • 计算机网络
  • 操作系统
  • 算法
  • 个人项目
  • 个人面试面经
  • 八股记忆
  • 工作积累
  • 逻辑题
  • 面试

    • 百度后端实习二面
GitHub (opens new window)
  • 华仔聊技术

  • 业务设计

  • 场景设计

  • 运维

  • 安全

  • 面试

  • mac相关工具推荐

  • 开发工具

  • 人工智能

  • 推荐

  • 阅读

  • 工具

    • idea相关
    • 常见的序列化工具
      • github个人资料展示
      • 个人资料
      • slf4j+logback
      • 跳板机
      • ssh原理
      • 正则表达式
      • 性能测试
      • github快速访问
    • 计划

    • 产品

    • 云原生

    • go

    • QVM

    • 软件设计师

    • 极客时间

    • 单元测试

    • 其他
    • 工具
    xugaoyi
    2023-06-09
    目录

    常见的序列化工具

    首先,序列化的方式有很多种,在设计模式中有一个叫做依赖倒置原则,即我们应该依赖抽象,而不是具体实现。所以对于项目中的序列化方式,我们一般都需要创建一个统一的Serializer接口,让其他具体的序列化方式来实现这个接口。

    public interface Serializer {
        /**
         * 序列化
         *
         * @param obj 要序列化的对象
         * @return 字节数组
         */
        byte[] serialize(Object obj);
    
        /**
         * 反序列化
         *
         * @param bytes 序列化后的字节数组
         * @param clazz 目标类
         * @param <T>   类的类型。举个例子,  {@code String.class} 的类型是 {@code Class<String>}.
         *              如果不知道类的类型的话,使用 {@code Class<?>}
         * @return 反序列化的对象
         */
        <T> T deserialize(byte[] bytes, Class<T> clazz);
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    # JSON

    # JDK 自带的序列化方式

    # kryo

    /**
     * Kryo serialization class, Kryo serialization efficiency is very high, but only compatible with Java language
     *
     * @author shuang.kou
     * @createTime 2020年05月13日 19:29:00
     */
    @Slf4j
    public class KryoSerializer implements Serializer {
    
        /**
         * Because Kryo is not thread safe. So, use ThreadLocal to store Kryo objects
         */
        private final ThreadLocal<Kryo> kryoThreadLocal = ThreadLocal.withInitial(() -> {
            Kryo kryo = new Kryo();
            kryo.register(RpcResponse.class);
            kryo.register(RpcRequest.class);
            return kryo;
        });
    
        @Override
        public byte[] serialize(Object obj) {
            try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                 Output output = new Output(byteArrayOutputStream)) {
                Kryo kryo = kryoThreadLocal.get();
                // Object->byte:将对象序列化为byte数组
                kryo.writeObject(output, obj);
                kryoThreadLocal.remove();
                return output.toBytes();
            } catch (Exception e) {
                throw new SerializeException("Serialization failed");
            }
        }
    
        @Override
        public <T> T deserialize(byte[] bytes, Class<T> clazz) {
            try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
                 Input input = new Input(byteArrayInputStream)) {
                Kryo kryo = kryoThreadLocal.get();
                // byte->Object:从byte数组中反序列化出对象
                Object o = kryo.readObject(input, clazz);
                kryoThreadLocal.remove();
                return clazz.cast(o);
            } catch (Exception e) {
                throw new SerializeException("Deserialization failed");
            }
        }
    
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    编辑 (opens new window)
    上次更新: 2024/02/22, 14:03:19
    idea相关
    github个人资料展示

    ← idea相关 github个人资料展示→

    最近更新
    01
    spark基础
    02-22
    02
    mysql读写分离和分库分表
    02-22
    03
    数据库迁移
    02-22
    更多文章>
    Theme by Vdoing | Copyright © 2019-2024 Evan Xu | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式