目录
1.protostuff 的 Maven 依赖
2.定义实体类
3.序列化工具类 ProtostuffSerializer 提供了序列化和反序列化方法
4.测试
利用 Jedis 提供的字节数组参数方法,如:
public String set(String key, String value)
public String set(byte[] key, byte[] value)
public byte[] get(byte[] key)
public String get(String key)
拥用这些 API 的支持,就可以将 Java 对象序列化为二进制,当应用需要获取 Java 对象时,使用 public byte[] get(byte[] key) 函数将字节数组取出,然后反序列化为 Java 对象即可。和很多 NoSQL 数据库 (例如Memchache、Ehcache)的客户端不同,Jedis 本身没有提供序列化的工具,也就是说开发者需要自己引入序列化的工具。序列化的工具有很多,例如 XML、Json、谷歌的 Protobuf 、Facebook 的 Thrift 等等,对于序列化工具的选择开发者可以根据自身的需求决定,下面以 protostuff (Protobuf 的 Java 客户端)为例子进行说明。
1.protostuff 的 Maven 依赖
<properties>
<protostuff.version>1.0.11</protostuff.version>
</properties>
<dependencies>
//redis客户端
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.2</version>
</dependency>
//protostuff 客户端
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-runtime</artifactId>
<version>${protostuff.version}</version>
</dependency>
<dependency>
<groupId>com.dyuproject.protostuff</groupId>
<artifactId>protostuff-core</artifactId>
<version>${protostuff.version}</version>
</dependency>
</dependencies>
2.定义实体类
package org.example.Entity;
import java.io.Serializable;
import java.util.Date;
public class Club implements Serializable {
private int id; //id
private String name;//名称
private String info;//描述
private Date createDate;//创建日期
private int rank;
public Club(int id, String name, String info, Date createDate, int rank) {
this.id = id;
this.name = name;
this.info = info;
this.createDate = createDate;
this.rank = rank;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public Date getCreateDate() {
return createDate;
}
public void setCreateDate(Date createDate) {
this.createDate = createDate;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
//测试使用
@Override
public String toString() {
return "Club{" +
"id=" + id +
", name='" + name + '\'' +
", info='" + info + '\'' +
", createDate=" + createDate +
", rank=" + rank +
'}';
}
}
3.序列化工具类 ProtostuffSerializer 提供了序列化和反序列化方法
package org.example.until;
import com.dyuproject.protostuff.LinkedBuffer;
import com.dyuproject.protostuff.ProtostuffIOUtil;
import com.dyuproject.protostuff.Schema;
import com.dyuproject.protostuff.runtime.RuntimeSchema;
import org.example.Entity.Club;
//序列化工具类
public class ProtostuffSerializer {
// 通过反射机制创建了 Club 类型的模式(schema)
private Schema<Club> schema = RuntimeSchema.createFrom(Club.class);
//序列化
public byte[] serialize(Club club){
//初始化序列化缓冲
LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE);
try {
//序列化成字节数组
return serializeInternal(club,schema,buffer);
}catch (Exception e){
throw new IllegalStateException(e.getMessage(),e);
}finally {
buffer.clear();
}
}
//反序列化
public Club deserialize(byte[] bytes){
try {
//拿到反序列化对象
Club club = deserializeInternal(bytes,schema.newMessage(),schema);
if (club != null){
return club;
}
}catch (Exception e){
throw new IllegalStateException(e.getMessage(),e);
}
return null;
}
//返回序列化数组
private <T> byte[] serializeInternal(final T source,final Schema<T> schema,LinkedBuffer buffer) {
return ProtostuffIOUtil.toByteArray(source,schema,buffer);
}
//将字节数组反序列化操作
private <T> T deserializeInternal(byte[] bytes, T result, Schema<T> schema) {
ProtostuffIOUtil.mergeFrom(bytes,result,schema);
return result;
}
}
4.测试
package org.example;
import org.example.Entity.Club;
import org.example.until.ProtostuffSerializer;
import redis.clients.jedis.Jedis;
import java.util.Date;
// 按两次 Shift 打开“随处搜索”对话框并输入 `show whitespaces`,
// 然后按 Enter 键。现在,您可以在代码中看到空格字符。
public class Main {
public static void main(String[] args) {
//生成序列化工具类
ProtostuffSerializer protostuffSerializer = new ProtostuffSerializer();
Jedis jedis = JedusUtils.getJedis();
String key = "club:1";
//定义实体对象
Club club = new Club(1,"AC","米兰",new Date(),1);
System.out.println("序列化:"+club);
//序列化
byte[] clubBytes = protostuffSerializer.serialize(club);
jedis.set(key.getBytes(),clubBytes);
//反序列化
byte[] resultBytes = jedis.get(key.getBytes());
//反序列化 1,"AC","米兰",new Date(),1
Club resultClub = protostuffSerializer.deserialize(resultBytes);
System.out.println("反序列化: "+resultClub);
}
}
运行结果如图:
最终成功实现。