1、Kryo的简介
Kryo 是一个快速高效的Java对象图形序列化框架,主要特点是性能、高效和易用。该项目用来序列化对象到文件、数据库或者网络。
代码地址:https://github.com/EsotericSoftware/kryo
样例代码地址:https://github.com/nettm/public
Kryo的序列化及反序列速度很快,据说很多大公司都在用。我在把对象序列化都转换成了字符串形式,是为了把对象存储到缓存中。我们日常项目中使用的数据形式包括对象、List、Set和Map,因此主要把这几种类型的数据进行了序列化及反序列化,支持对象中包含List、Set和Map。
2、pom文件的引入:
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo-shaded</artifactId>
<version>3.0.3</version>
</dependency>
import java.io.Serializable;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.codec.binary.Base64;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.serializers.CollectionSerializer;
import com.esotericsoftware.kryo.serializers.JavaSerializer;
import com.esotericsoftware.kryo.serializers.MapSerializer;
public class KryoUtils {
public static <T extends Serializable> String serializationObject(T obj) {
Kryo kryo = new Kryo();
kryo.setReferences(false);
kryo.register(obj.getClass(), new JavaSerializer());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Output output = new Output(baos);
kryo.writeClassAndObject(output, obj);
output.flush();
output.close();
byte[] b = baos.toByteArray();
try {
baos.flush();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
return new String(new Base64().encode(b));
}
@SuppressWarnings("unchecked")
public static <T extends Serializable> T deserializationObject(String obj,
Class<T> clazz) {
Kryo kryo = new Kryo();
kryo.setReferences(false);
kryo.register(clazz, new JavaSerializer());
ByteArrayInputStream bais = new ByteArrayInputStream(
new Base64().decode(obj));
Input input = new Input(bais);
return (T) kryo.readClassAndObject(input);
}
public static <T extends Serializable> String serializationList(
List<T> obj, Class<T> clazz) {
Kryo kryo = new Kryo();
kryo.setReferences(false);
kryo.setRegistrationRequired(true);
CollectionSerializer serializer = new CollectionSerializer();
serializer.setElementClass(clazz, new JavaSerializer());
serializer.setElementsCanBeNull(false);
kryo.register(clazz, new JavaSerializer());
kryo.register(ArrayList.class, serializer);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Output output = new Output(baos);
kryo.writeObject(output, obj);
output.flush();
output.close();
byte[] b = baos.toByteArray();
try {
baos.flush();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
return new String(new Base64().encode(b));
}
@SuppressWarnings("unchecked")
public static <T extends Serializable> List<T> deserializationList(
String obj, Class<T> clazz) {
Kryo kryo = new Kryo();
kryo.setReferences(false);
kryo.setRegistrationRequired(true);
CollectionSerializer serializer = new CollectionSerializer();
serializer.setElementClass(clazz, new JavaSerializer());
serializer.setElementsCanBeNull(false);
kryo.register(clazz, new JavaSerializer());
kryo.register(ArrayList.class, serializer);
ByteArrayInputStream bais = new ByteArrayInputStream(
new Base64().decode(obj));
Input input = new Input(bais);
return (List<T>) kryo.readObject(input, ArrayList.class, serializer);
}
public static <T extends Serializable> String serializationMap(
Map<String, T> obj, Class<T> clazz) {
Kryo kryo = new Kryo();
kryo.setReferences(false);
kryo.setRegistrationRequired(true);
MapSerializer serializer = new MapSerializer();
serializer.setKeyClass(String.class, new JavaSerializer());
serializer.setKeysCanBeNull(false);
serializer.setValueClass(clazz, new JavaSerializer());
serializer.setValuesCanBeNull(true);
kryo.register(clazz, new JavaSerializer());
kryo.register(HashMap.class, serializer);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Output output = new Output(baos);
kryo.writeObject(output, obj);
output.flush();
output.close();
byte[] b = baos.toByteArray();
try {
baos.flush();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
return new String(new Base64().encode(b));
}
@SuppressWarnings("unchecked")
public static <T extends Serializable> Map<String, T> deserializationMap(
String obj, Class<T> clazz) {
Kryo kryo = new Kryo();
kryo.setReferences(false);
kryo.setRegistrationRequired(true);
MapSerializer serializer = new MapSerializer();
serializer.setKeyClass(String.class, new JavaSerializer());
serializer.setKeysCanBeNull(false);
serializer.setValueClass(clazz, new JavaSerializer());
serializer.setValuesCanBeNull(true);
kryo.register(clazz, new JavaSerializer());
kryo.register(HashMap.class, serializer);
ByteArrayInputStream bais = new ByteArrayInputStream(
new Base64().decode(obj));
Input input = new Input(bais);
return (Map<String, T>) kryo.readObject(input, HashMap.class,
serializer);
}
public static <T extends Serializable> String serializationSet(Set<T> obj,
Class<T> clazz) {
Kryo kryo = new Kryo();
kryo.setReferences(false);
kryo.setRegistrationRequired(true);
CollectionSerializer serializer = new CollectionSerializer();
serializer.setElementClass(clazz, new JavaSerializer());
serializer.setElementsCanBeNull(false);
kryo.register(clazz, new JavaSerializer());
kryo.register(HashSet.class, serializer);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Output output = new Output(baos);
kryo.writeObject(output, obj);
output.flush();
output.close();
byte[] b = baos.toByteArray();
try {
baos.flush();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
return new String(new Base64().encode(b));
}
@SuppressWarnings("unchecked")
public static <T extends Serializable> Set<T> deserializationSet(
String obj, Class<T> clazz) {
Kryo kryo = new Kryo();
kryo.setReferences(false);
kryo.setRegistrationRequired(true);
CollectionSerializer serializer = new CollectionSerializer();
serializer.setElementClass(clazz, new JavaSerializer());
serializer.setElementsCanBeNull(false);
kryo.register(clazz, new JavaSerializer());
kryo.register(HashSet.class, serializer);
ByteArrayInputStream bais = new ByteArrayInputStream(
new Base64().decode(obj));
Input input = new Input(bais);
return (Set<T>) kryo.readObject(input, HashSet.class, serializer);
}
}
4、测试代码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Test;
public class TestKryo {
@Test
public void testObject() {
List<Book> lists = new ArrayList<Book>();
for (int i = 0; i < 5; i++) {
Book book = new Book();
book.setBookId(i);
book.setBookName("Javajishu" + i);
lists.add(book);
}
Person person = new Person();
person.setPage(20);
person.setPname("zhangsan");
person.setLists(lists);
// 序列化前的信息
System.out.println(person);
// 序列化后的信息
String string = KryoUtils.serializationObject(person);
System.out.println(string);
// 还原后的信息
Person p = KryoUtils.deserializationObject(string, Person.class);
System.out.println(p);
}
@Test
public void testList() {
List<Book> lists = new ArrayList<Book>();
for (int i = 0; i < 5; i++) {
Book book = new Book();
book.setBookId(i);
book.setBookName("Javajishu" + i);
lists.add(book);
}
// 序列化前的信息
System.out.println(lists);
// 序列化后的信息
String str = KryoUtils.serializationList(lists, Book.class);
System.out.println(str);
// 还原后的信息
List<Book> list2 = KryoUtils.deserializationList(str, Book.class);
System.out.println(list2);
}
@Test
public void testMap() {
Map<String, Book> map = new HashMap<String, Book>();
for (int i = 0; i < 10; i++) {
Book book = new Book();
book.setBookId(i);
book.setBookName("Javajishu" + i);
map.put(book.getBookId() + "", book);
}
// 序列化前的信息
System.out.println(map);
// 序列化后的信息
String str = KryoUtils.serializationMap(map, Book.class);
System.out.println(str);
// 还原后的信息
Map<String, Book> map2 = KryoUtils.deserializationMap(str, Book.class);
System.out.println(map2);
}
@Test
public void testSet() {
Set<Book> set = new HashSet<Book>();
for (int i = 0; i < 10; i++) {
Book book = new Book();
book.setBookId(i);
book.setBookName("Javajishu" + i);
set.add(book);
}
// 序列化前的信息
System.out.println(set);
// 序列化后的信息
String str = KryoUtils.serializationSet(set, Book.class);
System.out.println(str);
// 还原后的信息
Set<Book> set2 = KryoUtils.deserializationSet(str, Book.class);
System.out.println(set2);
}
}
5、 源码下载
6、原博客地址
http://nettm.blog.51cto.com/4841905/1702453