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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM