Kryo序列化物件為字串(Base64加密)
阿新 • • 發佈:2019-02-08
1、Kryo的簡介
Kryo 是一個快速高效的Java物件圖形序列化框架,主要特點是效能、高效和易用。該專案用來序列化物件到檔案、資料庫或者網路。
Kryo的序列化及反序列速度很快,據說很多大公司都在用。我在把物件序列化都轉換成了字串形式,是為了把物件儲存到快取中。我們日常專案中使用的資料形式包括物件、List、Set和Map,因此主要把這幾種型別的資料進行了序列化及反序列化,支援物件中包含List、Set和Map。
2、pom檔案的引入:
3、Kryo工具類<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