Step01:定義mail類:
package com.java.serializable;
import java.io.Serializable;
import java.util.Date;
public class Mail implements Serializable{
private static final long serialVersionUID = 6599166688654530165L;
private Integer id;
private String title;
private String content;
private Date createdTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getCreatedTime() {
return createdTime;
}
public void setCreatedTime(Date createdTime) {
this.createdTime = createdTime;
}
@Override
public String toString() {
return "Mail [id=" + id + ", title=" + title + ", content=" + content + ", createdTime=" + createdTime + "]";
}
}
Step02:添加依賴
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo</artifactId>
<version>5.0.0-RC4</version>
</dependency>
Step03:編寫測試類
package com.java.serializable;
import java.util.Date;
import org.apache.tomcat.util.http.fileupload.ByteArrayOutputStream;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
public class TestSerializable06 {
public static void main(String[] args) {
Mail m=new Mail();
m.setId(100);
m.setTitle("test");
m.setContent("this is test content");
m.setCreatedTime(new Date());
//基於Kryo框架將對象序列化
Kryo kryo=new Kryo();
//將默認類的自動註冊功能關閉(默認會將類全名序列化)
kryo.setRegistrationRequired(false);
//kryo.register(Mail.class);
//kryo.register(Date.class);
ByteArrayOutputStream bos=//內置可擴容數組
new ByteArrayOutputStream();
Output output=new Output(bos);
kryo.writeObject(output, m);
output.close();
System.out.println("序列化ok");
//基於Kryo框架將對象反序列化
byte[] data=bos.toByteArray();
Input input=new Input(data);
Mail m2=kryo.readObject(input,Mail.class);
input.close();
System.out.println(m2);
}
}
結果:
序列化ok
Mail [id=100, title=test, content=this is test content, createdTime=Mon Nov 11 14:15:35 CST 2019]
說明:可將如上序列化方法進行封裝,寫到序列化工具類中,例如
package com.java.serializable;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.Serializable;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
//基於Kryo框架實現對象序列化和反序列化.
/**
* kryo 對象是一個線程不安全對象,不允許多線程共享.
* 可以每個線程有一份。那如何保證每個線程此類的實例
* 只有一份呢?可以藉助ThreadLocal實現。
*
* ThreadLocal 提供一種線程綁定機制,可以基於
* 此對象將某個對象綁定當前線程中,也可以從當前
* 線程獲取某個對象.
* 1)set() 綁定
* 2)get() 獲取
*/
public class KryoSerializationUtil {
//static Kryo kryo = new Kryo();//線程共享
private static final ThreadLocal<Kryo> kryos = new ThreadLocal<Kryo>() {
//獲取當前線程中Kryo對象時,假如線程中沒有此對象
//此時會調用initialValue創建對象並通過set方法綁定當前線程
protected Kryo initialValue() {
Kryo kryo = new Kryo();
kryo.setRegistrationRequired(false);
// Configure the Kryo instance.
return kryo;
};
};
//序列化
public static <T extends Serializable>byte[] serializable(T t) throws IOException{
//1.構建kryo對象
//Kryo k = new Kryo();
//k.setRegistrationRequired(false);
//2.構建字節數組輸出流(內置可擴容數組)
ByteArrayOutputStream bos=
new ByteArrayOutputStream();
//3.構建處理流output對象
Output output=new Output(bos);
//4.將對象序列化
kryos.get().writeObject(output, t);
output.flush();
byte[] array=bos.toByteArray();
output.close();
return array;
}
//反序列化
public static<T>T deserialization(byte[] array,Class<T> cls) {
//1.構建kryo對象
//Kryo k=new Kryo();
//k.setRegistrationRequired(false);
//2.構建input對象(負責讀字節數據)
Input input=new Input(array);
//3.反序列化數據
T t=(T)kryos.get().readObject(input,cls);
input.close();
return t;
}
}
編寫測試類:
package com.java.serializable;
import java.io.IOException;
import java.util.Date;
public class TestSerializable07 {
public static void main(String[] args)throws IOException {
Mail m=new Mail();
m.setId(100);
m.setTitle("test");
m.setContent("this is test content");
m.setCreatedTime(new Date());
//基於Kryo框架將對象序列化
byte[] array=
KryoSerializationUtil.serializable(m);
System.out.println("序列化OK,array.length="+array.length);
//基於Kryo框架將對象反序列化
Mail m2=
KryoSerializationUtil.deserialization(array,Mail.class);
System.out.println(m2);
}
}
運行結果:
序列化OK,array.length=49
Mail [id=100, title=test, content=this is test content, createdTime=Mon Nov 11 18:04:03 CST 2019]
知識補充:
ThreadLocal原理及詳解參考文章:https://www.cnblogs.com/dolphin0520/p/3920407.html