zoukankan      html  css  js  c++  java
  • Java 序列化介绍及 Redis 序列化方式

    Java 序列化介绍及 Redis 序列化方式

    什么是 java 序列化?什么情况下需要序列化?

    1、序列化与反序列化

    • 序列化:将 Java 对象转换成字节流的过程。
    • 反序列化:将字节流转换成 Java 对象的过程。

    2、什么情况下需要序列化

    • 想把内存中的对象状态保存到一个文件中或者数据库中的时候(最常用,如保存到redis);
    • 想用套接字在网络上传送对象的时候;
    • 想通过RMI传输对象的时候;

    3、序列化的实现

    类实现 Serializable 接口即可,这个接口没有需要实现的方法。实现 Serializable 接口是为了告诉 jvm 这个类的对象可以被序列化。

    4、注意事项

    • 某个类可以被序列化,则其子类也可以被序列化
    • 声明为 static 和 transient 的成员变量,不能被序列化。static 成员变量是描述类级别的属性,transient 表示临时数据
    • 反序列化读取序列化对象的顺序要保持一致

    5、具体使用

    以 User 实体类为例:

    @Data
    @EqualsAndHashCode(callSuper = false)
    @AllArgsConstructor
    @NoArgsConstructor
    //实现序列化
    public class User implements Serializable {
    
        private static final long serialVersionUID=1L;
    
        @ApiModelProperty(value = "主键ID")
        @TableId(value = "id", type = IdType.AUTO)
        private Long id;
    
        @ApiModelProperty(value = "姓名")
        private String name;
    
        @ApiModelProperty(value = "年龄")
        private Integer age;
    }
    

    测试:

    @Test
    public void test1() throws IOException, ClassNotFoundException {
        //序列化对象User
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("user.txt"));
        User user = new User(2L, "haha", 13);
        oos.writeObject(user);
        //清除缓存、关闭
        oos.flush();
        oos.close();
    
        //反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("user.txt"));
        User readUser = (User) ois.readObject();
        System.out.println(readUser.toString());
    }
    

    在项目根目录可以找到 user.txt 文件并看到输出结果。

    参考资料1:https://blog.csdn.net/meism5/article/details/90413987

    参考资料2:https://blog.csdn.net/Mr_EvanChen/article/details/79724426

    6、Redis 序列化方式

    我使用的是 spring-data-redis, spring-data-redis默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略

    redisTemplate 可自定义各种 key 和各种 value 的序列化方式:

    • defaultSerializer: 默认序列化策略
    • key:普通key,非hash
    • value:普通value,非hash
    • hashKey:hash的filed
    • hashValue:hash的value

    总共有以下几个序列化类:

    • Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer实际上是一样的
    • JacksonJsonRedisSerializer: 序列化object对象为json字符串
    • JdkSerializationRedisSerializer: 序列化java对象(被序列化的对象必须实现Serializable接口),无法转义成对象。
    • StringRedisSerializer: 简单的字符串序列化
    • GenericToStringSerializer:类似StringRedisSerializer的字符串序列化
    • GenericJackson2JsonRedisSerializer:类似Jackson2JsonRedisSerializer,但使用时构造函数不用特定的类参考以上序列化,自定义序列化类。

    推荐使用GenericJackson2JsonRedisSerializer 或 Jackson2JsonRedisSerializer 。

    **StringRedisTemplate **默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。序列化类为:StringRedisSerializer
    **RedisTemplate **默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。序列化类为:JdkSerializationRedisSerializer

    7、Redis 推荐序列化类

    key和hashKey: 推荐使用 StringRedisSerializer: 简单的字符串序列化

    value和hashValue: 推荐使用GenericJackson2JsonRedisSerializer:类似Jackson2JsonRedisSerializer,但使用时构造函数不用特定的类

    参考资料:https://blog.csdn.net/y532798113/article/details/82690781

    自我控制是最强者的本能-萧伯纳
  • 相关阅读:
    HDU 3047 Zjnu Stadium 带权并查集
    Arrays.sort()
    cache与负载均衡
    Java实现第八届蓝桥杯包子凑数
    Java实现第八届蓝桥杯日期问题
    Java实现第八届蓝桥杯日期问题
    Java实现第八届蓝桥杯取数位
    Java实现第八届蓝桥杯取数位
    Java实现第八届蓝桥杯纸牌三角形
    Java实现第八届蓝桥杯承压计算
  • 原文地址:https://www.cnblogs.com/CF1314/p/14737736.html
Copyright © 2011-2022 走看看