下面要序列化的类:
package com.crossdomain.edu.apc.course.redis.entity;
import java.io.Serializable;
public class Student implements Serializable{
private static final long serialVersionUID = -1853666810651064075L;
private String name;
private String gender;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
序列化 的对象:
private Student stu=new Student();
stu.setAge(22);
stu.setName("lisi");
stu.setGender("mail");
JdkSerializationRedisSerializer
这种序列化方式是基于Java的Serializable,被序列化的对象必须实现这个接口。
使用方式:
template.setKeySerializer(new StringRedisSerializer());
Redis存储的:
序列化后是一串乱码:
"\xac\xed\x00\x05sr\x003com.crossdomain.edu.apc.course.redis.entity.Student\xe6Fs\xdb[6H\xf5\x02\x00\x03I\x00\x03ageL\x00\x06gendert\x00\x12Ljava/lang/String;L\x00\x04nameq\x00~\x00\x01xp\x00\x00\x00\x16t\x00\x04mailt\x00\x04lisi"
反序列化后是正常的对象,下面是浏览器访问的结果。
{"name":"lisi","gender":"mail","age":22}
Jackson2JsonRedisSerializer
使用方式如下:
template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Student.class));
序列化后redis中存储的是:
"{\"name\":\"lisi\",\"gender\":\"mail\",\"age\":22}"
就是一个json字符串。
浏览器一样可以访问到正确的结果。
GenericJackson2JsonRedisSerializer
使用方式:
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
存储的序列化结果:
"{\"@class\":\"com.crossdomain.edu.apc.course.redis.entity.Student\",\"name\":\"lisi\",\"gender\":\"mail\",\"age\":22}"
这种方式和Jackson2Json相比,还把当前的class序列化进去了。
还可以这样,把class放在指定的属性上。
template.setValueSerializer(new GenericJackson2JsonRedisSerializer("abcd"));
"{\"abcd\":\"com.crossdomain.edu.apc.course.redis.entity.Student\",\"name\":\"lisi\",\"gender\":\"mail\",\"age\":22}"
OxmSerializer
这种序列化方式,一直没有实现成功!找了各种资料,最后从官网上了解到
public OxmSerializer()
Creates a new, uninitialized OxmSerializer.
Requires setMarshaller(Marshaller) and setUnmarshaller(Unmarshaller) to be set before this serializer can be used.
所以template.setValueSerializer(new OxmSerializer());这样用会报空指针异常。Marshaller和Unmarshaller分别对应序列化和反序列化,不能为空。这两个东西到底怎么用,有待了解。
下面是官网的原话,表述这种序列化的方式:
Serializer adapter on top of Spring‘s O/X Mapping. Delegates serialization/deserialization to OXM Marshaller and Unmarshaller. Note: null objects are serialized as empty arrays and vice versa.
是java Object和xml 转换的适配器。
这种序列化,以后有时间再研究吧!
总结:
StringRedisSerializer这种序列化太常见,也很简单,就没有写。
以下观点源于网上,经过测试我也认同:
上面三种序列化,Jdk的专门用于java的,速度很快,但从存储结果看,是最占用redis资源的,而且不能跨语言,只能用于java语言。
最省存储资源的Jackson2Json,相比还有跨语言的特点,只要支持json,都能转换成自己的数据。
这两种方式推荐使用!