本章将介绍 Spring Data Redis 的序列化接口 org.springframework.data.redis.serializer.RedisSerializer。
RedisSerializer 基础接口定义了将对象转换为字节数组(二进制数据)的序列化和反序列化方法。建议将实现设计为在序列化和反序列化端处理空对象/空字节数组。注意,Redis 不接受空键或空值,但可以返回 null(对于不存在的键)。
序列化方法定义如下:
byte[] serialize(T t)
该方法将给定对象 t 序列化为二进制数据,及字节数组。注意:对象 t 和返回值可以为 null。
反序列化方法定义如下:
T deserialize(byte[] bytes)
该方法将从给定的二进制数据(字节数组)反序列化为一个对象。注意:bytes 字节数组和返回值 T 均可以为 null。
注意:如果上面的 serialize() 和 deserialize() 方法在执行时报错,将抛出org.springframework.data.redis.serializer.SerializationException 异常。
下面将通过 Spring Data Redis 提供的 org.springframework.data.redis.serializer.StringRedisSerializer 实现来学习怎样实现序列化和反序列。StringRedisSerializer 源码如下:
package org.springframework.data.redis.serializer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import org.springframework.lang.Nullable; import org.springframework.util.Assert; public class StringRedisSerializer implements RedisSerializer<String> { // 定义字符集 private final Charset charset; public static final StringRedisSerializer US_ASCII = new StringRedisSerializer(StandardCharsets.US_ASCII); public static final StringRedisSerializer ISO_8859_1 = new StringRedisSerializer(StandardCharsets.ISO_8859_1); public static final StringRedisSerializer UTF_8 = new StringRedisSerializer(StandardCharsets.UTF_8); // 使用 StandardCharsets.UTF_8 创建一个新的 StringRedisSerializer。 public StringRedisSerializer() { this(StandardCharsets.UTF_8); } // 使用给定的 Charset 创建一个新的 StringRedisSerializer 来编码和解码字符串。 public StringRedisSerializer(Charset charset) { Assert.notNull(charset, "Charset must not be null!"); this.charset = charset; } // 反序列化,将字节数组转换成字符串 @Override public String deserialize(@Nullable byte[] bytes) { return (bytes == null ? null : new String(bytes, charset)); } // 序列化,将字符串转换成字节数组 @Override public byte[] serialize(@Nullable String string) { return (string == null ? null : string.getBytes(charset)); } }
上面代码虽然简单,但却完整的说明了怎样去实现 RedisSerializer 接口,主要关注 serialize() 和 deserialize() 方法。