1. 程式人生 > >Kryo序列化物件為字串(Base64加密)

Kryo序列化物件為字串(Base64加密)

1、Kryo的簡介

Kryo 是一個快速高效的Java物件圖形序列化框架,主要特點是效能、高效和易用。該專案用來序列化物件到檔案、資料庫或者網路。

      Kryo的序列化及反序列速度很快,據說很多大公司都在用。我在把物件序列化都轉換成了字串形式,是為了把物件儲存到快取中。我們日常專案中使用的資料形式包括物件、List、Set和Map,因此主要把這幾種型別的資料進行了序列化及反序列化,支援物件中包含List、Set和Map。

2、pom檔案的引入:

<dependency>
    <groupId>com.esotericsoftware</groupId>
    <artifactId>kryo-shaded</artifactId>
    <version>3.0.3</version>
</dependency>
3、Kryo工具類
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