Kryo序列化及反序列化用法示例
Kryo 是一個快速高效的 Java 對象圖形序列化框架,主要特點是性能、高效和易用。該項目用來序列化對象到文件、數(shù)據(jù)庫或者網(wǎng)絡(luò)。
代碼地址:https://github.com/EsotericSoftware/kryo
樣例代碼地址:https://github.com/nettm/public
Kryo的序列化及反序列速度很快,據(jù)說很多大公司都在用。我在把對象序列化都轉(zhuǎn)換成了字符串形式,是為了把對象存儲到緩存中。我們?nèi)粘m椖恐惺褂玫臄?shù)據(jù)形式包括對象、List、Set和Map,因此主要把這幾種類型的數(shù)據(jù)進行了序列化及反序列化,支持對象中包含List、Set和Map。
首先在項目的pom文件中引入:
<dependency> <groupId>com.esotericsoftware</groupId> <artifactId>kryo-shaded</artifactId> <version>3.0.3</version> </dependency>
代碼KryoTest:
package com.nettm.serializable;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
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 org.testng.Assert;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
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 KryoTest {
private long time;
@BeforeTest
public void beforeTest() {
time = System.currentTimeMillis();
}
@AfterTest
public void afterTest() {
System.out.println(System.currentTimeMillis() - time);
}
@Test(invocationCount = 1, threadPoolSize = 1)
public void testObject() {
CustomItemDto val = new CustomItemDto();
val.setId(Long.parseLong(String.valueOf(1)));
val.setItemCode("");
val.setItemDespositPrice(32.45);
val.setItemMemo(null);
val.setItemName("張金");
val.setItemPrice(89.02);
val.setSort(10);
String a = serializationObject(val);
CustomItemDto newValue = deserializationObject(a, CustomItemDto.class);
Assert.assertEquals(val.getId(), newValue.getId());
}
@Test(invocationCount = 1, threadPoolSize = 1)
public void testList() {
List<CustomItemDto> lst = new ArrayList<CustomItemDto>();
for (int i = 0; i < 10; i++) {
CustomItemDto val = new CustomItemDto();
val.setId(Long.parseLong(String.valueOf(i)));
val.setItemCode("");
val.setItemDespositPrice(32.45);
val.setItemMemo(null);
val.setItemName("張金");
val.setItemPrice(89.02);
val.setSort(10);
lst.add(val);
}
String a = serializationList(lst, CustomItemDto.class);
List<CustomItemDto> newValue = deserializationList(a,
CustomItemDto.class);
Assert.assertEquals(lst.size(), newValue.size());
}
@Test(invocationCount = 1, threadPoolSize = 1)
public void testBean() {
List<CustomCategoryDto> lst = new ArrayList<CustomCategoryDto>();
for (int j = 0; j < 10; j++) {
CustomCategoryDto dto = new CustomCategoryDto();
dto.setCategoryCode("ABCD_001");
dto.setCategoryName("呼吸系統(tǒng)");
for (int i = 0; i < 10; i++) {
CustomItemDto val = new CustomItemDto();
val.setId(Long.parseLong(String.valueOf(i)));
val.setItemCode("");
val.setItemDespositPrice(32.45);
val.setItemMemo(null);
val.setItemName("張金");
val.setItemPrice(89.02);
val.setSort(10);
dto.getCustomItemList().add(val);
}
for (int i = 0; i < 10; i++) {
CustomItemDto val = new CustomItemDto();
val.setId(Long.parseLong(String.valueOf(i)));
val.setItemCode("");
val.setItemDespositPrice(32.45);
val.setItemMemo(null);
val.setItemName("張金");
val.setItemPrice(89.02);
val.setSort(10);
dto.getCustomItemSet().add(val);
}
for (int i = 0; i < 10; i++) {
CustomItemDto val = new CustomItemDto();
val.setId(Long.parseLong(String.valueOf(i)));
val.setItemCode("");
val.setItemDespositPrice(32.45);
val.setItemMemo(null);
val.setItemName("張金");
val.setItemPrice(89.02);
val.setSort(10);
dto.getCustomItemMap().put(String.valueOf(i), val);
}
lst.add(dto);
}
String a = serializationList(lst, CustomCategoryDto.class);
List<CustomCategoryDto> newValue = deserializationList(a,
CustomCategoryDto.class);
Assert.assertEquals(lst.size(), newValue.size());
}
@Test(invocationCount = 1, threadPoolSize = 1)
public void testMap() {
Map<String, CustomItemDto> map = new HashMap<String, CustomItemDto>();
for (int i = 0; i < 10; i++) {
CustomItemDto val = new CustomItemDto();
val.setId(Long.parseLong(String.valueOf(i)));
val.setItemCode("");
val.setItemDespositPrice(32.45);
val.setItemMemo(null);
val.setItemName("張金");
val.setItemPrice(89.02);
val.setSort(10);
map.put(new ObjectId().toString(), val);
}
String a = serializationMap(map, CustomItemDto.class);
Map<String, CustomItemDto> newValue = deserializationMap(a,
CustomItemDto.class);
Assert.assertEquals(map.size(), newValue.size());
}
@Test(invocationCount = 1, threadPoolSize = 1)
public void testSet() {
Set<CustomItemDto> set = new HashSet<CustomItemDto>();
for (int i = 0; i < 10; i++) {
CustomItemDto val = new CustomItemDto();
val.setId(Long.parseLong(String.valueOf(i)));
val.setItemCode("");
val.setItemDespositPrice(32.45);
val.setItemMemo(null);
val.setItemName("金星");
val.setItemPrice(89.02);
val.setSort(10);
set.add(val);
}
String a = serializationSet(set, CustomItemDto.class);
Set<CustomItemDto> newValue = deserializationSet(a, CustomItemDto.class);
Assert.assertEquals(set.size(), newValue.size());
}
private <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")
private <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);
}
private <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")
private <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);
}
private <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")
private <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);
}
}
總結(jié)
以上就是本文關(guān)于Kryo序列化及反序列化用法示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以參閱:java原生序列化和Kryo序列化性能實例對比分析 、 Kryo框架使用方法代碼示例等,有什么問題可以隨時留言,小編一定竭盡所能,答您所問。
相關(guān)文章
Java中List轉(zhuǎn)Map的幾種常見方式與對比
JavaList轉(zhuǎn)Map是一個非常常用的技術(shù),對于Java開發(fā)人員來講,掌握該技術(shù)可以幫助我們更加高效地操作List集合中的對象,這篇文章主要給大家介紹了關(guān)于Java中List轉(zhuǎn)Map的幾種常見方式與對比的相關(guān)資料,需要的朋友可以參考下2024-02-02
Spring Boot 統(tǒng)一數(shù)據(jù)返回格式的解決方案
統(tǒng)?的數(shù)據(jù)返回格式使? @ControllerAdvice 和 ResponseBodyAdvice 的?式實現(xiàn),下面給大家分享Spring Boot 統(tǒng)一數(shù)據(jù)返回格式的解決方案,感興趣的朋友一起看看吧2024-03-03
Mybatis_plus基礎(chǔ)教程(總結(jié)篇)
這篇文章主要介紹了Mybatis_plus基礎(chǔ)教程(總結(jié)篇),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
Java的MyBatis框架中關(guān)鍵的XML字段映射的配置參數(shù)詳解
將XML文件的schema字段映射到數(shù)據(jù)庫的schema是我們操作數(shù)據(jù)庫的常用手段,這里我們就來整理一些Java的MyBatis框架中關(guān)鍵的XML字段映射的配置參數(shù)詳解,需要的朋友可以參考下2016-06-06
SpringBoot集成阿里巴巴Druid監(jiān)控的示例代碼
這篇文章主要介紹了SpringBoot集成阿里巴巴Druid監(jiān)控的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04

