-
Notifications
You must be signed in to change notification settings - Fork 1
/
KryoRedisSerializer.java
96 lines (87 loc) · 3.11 KB
/
KryoRedisSerializer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package org.spring.springboot.utils.serialize;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.pool.KryoCallback;
import com.esotericsoftware.kryo.pool.KryoFactory;
import com.esotericsoftware.kryo.pool.KryoPool;
import com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import java.io.ByteArrayOutputStream;
/**
* @author luckylau
* @date 2017/12/13/013 10:14
*/
public class KryoRedisSerializer<T> implements RedisSerializer<T> {
private static final Logger logger = LoggerFactory.getLogger(KryoRedisSerializer.class);
private KryoPool getKryoPool(){
KryoFactory kryoFactory = new KryoFactory() {
@Override
public Kryo create() {
Kryo kryo = new Kryo();
kryo.setDefaultSerializer(CompatibleFieldSerializer.class);
return kryo;
}
};
//softReferences防止内存溢出
return new KryoPool.Builder(kryoFactory).softReferences().build();
}
/* 这样实现也可以
@Override
public byte[] serialize(T t) throws SerializationException {
KryoPool kryoPool = getKryoPool();
Kryo kryo = kryoPool.borrow();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Output output = new Output(stream);
kryo.writeClassAndObject(output, t);
output.close();
kryoPool.release(kryo);
return stream.toByteArray();
}*/
@Override
public byte[] serialize(final T t) throws SerializationException {
return getKryoPool().run(new KryoCallback<byte[]>() {
@Override
public byte[] execute(Kryo kryo){
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Output output = new Output(stream);
kryo.writeClassAndObject(output, t);
output.close();
return stream.toByteArray();
}
});
}
/*
这样实现也可以
@Override
public T deserialize(byte[] bytes) throws SerializationException {
if(bytes == null || bytes.length == 0){
return null;
}
KryoPool kryoPool = getKryoPool();
Kryo kryo = kryoPool.borrow();
Input input = new Input(bytes);
T o = (T)kryo.readClassAndObject(input);
input.close();
kryoPool.release(kryo);
return o;
}*/
@Override
public T deserialize(final byte[] bytes) throws SerializationException {
if(bytes == null || bytes.length == 0){
return null;
}
return getKryoPool().run(new KryoCallback<T>() {
@Override
public T execute(Kryo kryo){
Input input = new Input(bytes);
T o = (T)kryo.readClassAndObject(input);
input.close();
return o;
}
});
}
}