Kryo序列化及反序列化用法示例

网友投稿 927 2023-03-27


Kryo序列化及反序列化用法示例

Kryo 是一个快速高效的 java 对象图形序列化框架,主要特点是性能、高效和易用。该项目用来序列化对象到文件、数据库或者网络。

代码地址:https://github.com/EsotericSoftware/kryo

样例代码地址:https://github.com/nettm/public

Kryo的序列化及反序列速度很快,据说很多大公司都在用。我在把对象序列化都转换成了字符串形式,是为了把对象存储到缓存中。我们日常项目中使用的数据形式包括对象、List、Set和Map,因此主要把这几种类型的数据进行了序列化及反序列化,支持对象中包含List、Set和Map。

首先在项目的pom文件中引入:

com.esotericsoftware

kryo-shaded

3.0.3

代码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 lst = new ArrayList();

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 newValue = deserializationList(a,

CustomItemDto.class);

Assert.assertEquals(lst.size(), newValue.size());

}

@Test(invocationCount = 1, threadPoolSize = 1)

public void testBean() {

List lst = new ArrayList();

for (int j = 0; j < 10; j++) {

CustomCategoryDto dto = new CustomCategoryDto();

dto.setCategoryCode("ABCD_001");

dto.setCategoryName("呼吸系统");

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 newValue = deserializationList(a,

CustomCategoryDto.class);

Assert.assertEquals(lst.size(), newValue.size());

}

@Test(invocationCount = 1, threadPoolSize = 1)

public void testMap() {

Map map = new HashMap();

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);

}

StringQMMMWanLr a = serializationMap(map, CustomItemDto.class);

Map newValue = deserializationMap(a,

CustomItemDto.class);

Assert.assertEquals(map.size(), newValue.size());

}

@Test(invocationCount = 1, threadPoolhttp://Size = 1)

public void testSet() {

Set set = new HashSet();

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 newValue = deserializationSet(a, CustomItemDto.class);

Assert.assertEquals(set.size(), newValue.size());

}

private 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 deserializationObject(String obj,

Class 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 String serializationList(List obj,

Class 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 List deserializationList(String obj,

Class 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) kryo.readObject(input, ArrayList.class, serializer);

}

private String serializationMap(

Map obj, Class 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 Map deserializationMap(

String obj, Class 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) kryo.readObject(input, HashMap.class,

serializer);

}

public static String serializationSet(Set obj,

Class 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 Set deserializationSet(

String obj, Class 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 ByteArrayIQMMMWanLrnputStream(

new Base64().decode(obj));

Input input = new Input(bais);

return (Set) kryo.readObject(input, HashSet.class, serializer);

}

}

总结

以上就是本文关于Kryo序列化及反序列化用法示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:java原生序列化和Kryo序列化性能实例对比分析 、 Kryo框架使用方法代码示例等,有什么问题可以随时留言,一定竭尽所能,答您所问。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:全面了解Java中的CAS机制
下一篇:java随机数生产算法实例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~