Kryo序列化與反序列化列子
這是一個Kryo將複雜Bean物件序列化與反序列化,通過字串傳遞的列子。
具體的bean物件此處沒有附加程式碼,可以自己寫一個bean的例子,裡面可包含任何物件,集合,基本型別。但要求有geter和setter方法。
本人在本地測試類以下,除了Map需要Setter方法外,其他屬性沒有setter方法也可序列化與反序列化。
這個例子中使用到了 Class BeanSerializer, 以下是這個類的介紹:
Serializes Java beans using bean accessor methods. Only bean properties with both a getter and setter are serialized
BeanSerializer does not write header data, only the object data is stored. If the type of a bean property is not final (note primitives are final) then an extra byte is written for that property.
TaskResult的類:
TaskItemResult類:
package bhz.test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache .commons.codec.binary.Base64;
import bhz.test.task.ExecItemResultIPMI;
import bhz.test.task.IExecItemResult;
import bhz.test.task.ITaskResult;
import bhz.test.task.TaskItemResult;
import bhz.test.task.TaskResult;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.serializers.BeanSerializer;
import com.esotericsoftware.kryo.serializers.JavaSerializer;
import com.esotericsoftware.kryo.serializers.MapSerializer;
import com.po.Animal;
import com.po.Dog;
import com.veraxsystems.vxipmi.coding.commands.ResponseData;
import com.veraxsystems.vxipmi.coding.commands.sdr.GetSdrResponseData;
public class KyroSerializableOne {
public static void main(String[] args) throws IOException {
/*
long start = System.currentTimeMillis();
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("zhang0", 2);
map.put("zhang1", 3);
Simple simple = new Simple("zhang" + 2, 2, map);
//System.out.println(simple.getAge() + " " + simple.getName() + " "
// + simple.getMap().toString());
ExecItemResultIPMI ipmiResult = new ExecItemResultIPMI();
Dog dog = (Dog)simple.getDog();
dog.getExecItemResult().add(ipmiResult);
System.out.println("Kryo 序列化時間:" + (System.currentTimeMillis() - start)
+ " ms");
start = System.currentTimeMillis();
Dog dogSerial = (Dog)simple.getDog();
IExecItemResult iExecItemResult = dogSerial.getExecItemResult().get(0);
ExecItemResultIPMI ipmiResultSerial = (ExecItemResultIPMI)iExecItemResult;
GetSdrResponseData getSdrResponseData = (GetSdrResponseData)ipmiResultSerial.getResponseData();
//序列化
String data= setSerializableObject(simple,Simple.class);
//反序列化
Simple simple1 = (Simple)getSerializableObject(Simple.class,data);
System.out.println(simple1.getAge() + " " + simple1.getName() + " "
+ simple1.getMap().toString()+" "+simple1.getDog().getName()+" ipmiResultSerial :"+ipmiResultSerial.getResponseData()+
" getSdrResponseData:" +new String(getSdrResponseData.getSensorRecordData()));
System.out.println("Kryo 反序列化時間:"
+ (System.currentTimeMillis() - start) + " ms");
*/
/*GetSdrResponseData getSdrResponseData = new GetSdrResponseData();
getSdrResponseData.setNextRecordId(111);
getSdrResponseData.setSensorRecordData("getSdrResponseData".getBytes());
ResponseData responseData = getSdrResponseData;
*/
TaskResult taskResult = new TaskResult();
Map<Integer, TaskItemResult> taskItemResult = taskResult.getTaskItemResult();
TaskItemResult itemResult = new TaskItemResult();
List<IExecItemResult> execItemResult = itemResult.getExecItemResult();
ExecItemResultIPMI ipmiResult = new ExecItemResultIPMI();
execItemResult.add(ipmiResult);
taskItemResult.put(111, itemResult);
System.out.println(taskResult);
//ITaskResult result = taskResult;
//System.out.println(result.getTaskItemResult());
String setSerializableObject = setSerializableObject(taskResult,TaskResult.class);
TaskResult resultObject = (TaskResult)getSerializableObject(TaskResult.class, setSerializableObject);
Map<Integer, TaskItemResult> taskItemResult2 = resultObject.getTaskItemResult();
System.out.println(taskItemResult2);
}
public static <T> String setSerializableObject(Object object,Class<T> clazz ) throws FileNotFoundException {
Kryo kryo = new Kryo();
/*MapSerializer serializer = new MapSerializer();
serializer.setKeyClass(Integer.class, new JavaSerializer());
serializer.setKeysCanBeNull(false);
serializer.setValueClass(TaskItemResult.class, new BeanSerializer(kryo, TaskItemResult.class));
serializer.setValuesCanBeNull(true);
kryo.register(HashMap.class, serializer);*/
kryo.register(clazz, new BeanSerializer(kryo, clazz));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Output output = new Output(baos);
kryo.writeObject(output, object);
output.flush();
output.close();
byte[] bys = baos.toByteArray();
try {
baos.flush();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
String string = new String(new Base64().encode(bys));
//getSerializableObject(string);
System.out.println(string);
return string;
}
public static <T> Object getSerializableObject(Class<T> clazz, String data) {
Kryo kryo = new Kryo();
/* MapSerializer serializer = new MapSerializer();
serializer.setKeyClass(Integer.class, new JavaSerializer());
serializer.setKeysCanBeNull(false);
serializer.setValueClass(TaskItemResult.class, new BeanSerializer(kryo, TaskItemResult.class));
serializer.setValuesCanBeNull(true);
kryo.register(HashMap.class, serializer);*/
kryo.register(clazz, new BeanSerializer(kryo, clazz));
ByteArrayInputStream bais = new ByteArrayInputStream(new Base64().decode(data.getBytes()));
Input input;
Object simple = null;
try {
input = new Input(bais);
input.close();
simple = kryo.readObject(input, clazz);
// if((simple=kryo.readObject(input, Simple.class)) != null){
//System.out.println(simple.getAge() + " " + simple.getName() + " "
// + simple.getMap().toString()+" "+simple.getDog().getName());
// }
} catch (Exception e) {
e.printStackTrace();
}
return simple;
}
}
更新:
以下是經過整理和執行驗證過的方法:
將需要序列化的Bean物件 ArrayList、 HashMap 放入方法中序列化,然後在反序列化,強轉成自己想要的型別即可。
以下是序列化反序列化的方法:
/**
* 序列化bean物件的方法
* @param object
* @param clazz
* @return
* @throws FileNotFoundException
*/
public static <T> String setSerializableObject(Object object,Class<T> clazz ) throws FileNotFoundException {
Kryo kryo = new Kryo();
kryo.register(clazz, new BeanSerializer<T>(kryo, clazz));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Output output = new Output(baos);
kryo.writeObject(output, object);
output.flush();
output.close();
byte[] bys = baos.toByteArray();
try {
baos.flush();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
String string = new String(new Base64().encode(bys));
System.out.println(string);
return string;
}
/**
* 反序列化bean物件的方法
* @param clazz
* @param data
* @return
*/
public static <T> Object getSerializableObject(Class<T> clazz, String data) {
Kryo kryo = new Kryo();
kryo.register(clazz, new BeanSerializer<T>(kryo, clazz)); //bean
ByteArrayInputStream bais = new ByteArrayInputStream(new Base64().decode(data.getBytes()));
Input input;
Object simple = null;
try {
input = new Input(bais);
input.close();
simple = kryo.readObject(input, clazz); //bean
//simple = kryo.readObject(input, ArrayList.class, serializer);//list
} catch (Exception e) {
e.printStackTrace();
}
return simple;
}
/**
* 序列化arrayList的方法
* @param object
* @param clazz
* @return
* @throws FileNotFoundException
*/
public static <T> String setSerializableList(Object object,Class<T> clazz ) throws FileNotFoundException {
Kryo kryo = new Kryo();
CollectionSerializer serializer = new CollectionSerializer();
serializer.setElementClass(clazz, new BeanSerializer<T>(kryo, clazz));
serializer.setElementsCanBeNull(false);
kryo.register(clazz, new BeanSerializer<T>(kryo, clazz));
kryo.register(ArrayList.class, serializer);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Output output = new Output(baos);
kryo.writeObject(output, object);
output.flush();
output.close();
byte[] bys = baos.toByteArray();
try {
baos.flush();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
String string = new String(new Base64().encode(bys));
System.out.println(string);
return string;
}
/**
* 反序列化ArrayList的方法
* @param clazz
* @param data
* @return
*/
public static <T> Object getSerializableList(Class<T> clazz, String data) {
Kryo kryo = new Kryo();
//List
CollectionSerializer serializer = new CollectionSerializer();
serializer.setElementClass(clazz, new BeanSerializer<T>(kryo, clazz));
serializer.setElementsCanBeNull(false);
kryo.register(clazz, new BeanSerializer<T>(kryo, clazz));
kryo.register(ArrayList.class, serializer);
ByteArrayInputStream bais = new ByteArrayInputStream(new Base64().decode(data.getBytes()));
Input input;
Object simple = null;
try {
input = new Input(bais);
input.close();
simple = kryo.readObject(input, ArrayList.class, serializer);//list
} catch (Exception e) {
e.printStackTrace();
}
return simple;
}
/**
* 序列化HashMap<String, clazz>的方法 key為 String型別 value型別為 clazz
* @param object
* @param clazz
* @return
* @throws FileNotFoundException
*/
public static <T> String setSerializableMap(Object object,Class<T> clazz ) throws FileNotFoundException {
Kryo kryo = new Kryo();
//設定序列化map的key和value型別
MapSerializer serializer = new MapSerializer();
serializer.setKeyClass(String.class, new JavaSerializer());
serializer.setKeysCanBeNull(false);
serializer.setValueClass(clazz, new BeanSerializer<T>(kryo, clazz));
serializer.setValuesCanBeNull(true);
//註冊要序列化的物件
kryo.register(HashMap.class, serializer);
kryo.register(clazz, new BeanSerializer<T>(kryo, clazz));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Output output = new Output(baos);
kryo.writeObject(output, object);
output.flush();
output.close();
byte[] bys = baos.toByteArray();
try {
baos.flush();
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
String string = new String(new Base64().encode(bys));
System.out.println(string);
return string;
}
/**
* HashMap<String,clazz>型別的map反序列化。
* @param clazz
* @param data
* @return
*/
public static <T> Object getSerializableMap(Class<T> clazz, String data) {
Kryo kryo = new Kryo();
//Map
MapSerializer serializer = new MapSerializer();
serializer.setKeyClass(String.class, new JavaSerializer());
serializer.setKeysCanBeNull(false);
serializer.setValueClass(clazz, new BeanSerializer<T>(kryo, clazz));
serializer.setValuesCanBeNull(true);
kryo.register(HashMap.class, serializer);
kryo.register(clazz, new BeanSerializer<T>(kryo, clazz)); //bean
ByteArrayInputStream bais = new ByteArrayInputStream(new Base64().decode(data.getBytes()));
Input input;
Object simple = null;
try {
input = new Input(bais);
input.close();
simple = kryo.readObject(input, HashMap.class, serializer); //bean
} catch (Exception e) {
e.printStackTrace();
}
return simple;
}
相關推薦
Kryo序列化與反序列化列子
這是一個Kryo將複雜Bean物件序列化與反序列化,通過字串傳遞的列子。 具體的bean物件此處沒有附加程式碼,可以自己寫一個bean的例子,裡面可包含任何物件,集合,基本型別。但要求有geter和setter方法。 本人在本地測試類以下,除了Map需要Se
java jackson avro kryo等幾種序列化與反序列化工具的使用
最近由於工作需要,需要研究常用的集中序列化方式,主要目的是物件序列化後佔用空間會大大減少,便於儲存和傳輸,下面是幾種序列化方式的使用demo 1. Java自帶的Serialize 依賴jar包:無 程式碼示意: import java.io.{ByteArrayInpu
Java核心類庫-IO-對象流(實現序列化與反序列化)
.get throws 反序 code row cts new java cep 使用對象流來完成序列化和反序列化操作: ObjectOutputStream:通過writeObject()方法做序列化操作的 ObjectInputStream:通過readObje
Java IO-5 序列化與反序列化流
str ride log getname file urn turn objects transient 建一個Person類 1 package demo05; 2 3 import java.io.Serializable; 4 5 public cla
契約類相關的序列化與反序列化
pub ima cti 相關 ria 數據 num spa set 契約類指繼承了:DataContract的類。契約類常在WCF,webService等各種服務中作為傳輸數據使用。 凡是契約類或者繼承了契約類的類,如果想要屬性參與序列化與反序列化,需要在屬性上加上標記:D
Java序列化與反序列化
setname [] 進制 方式 gets 創建 保存 ati 取數據 Java序列化與反序列化是什麽?為什麽需要序列化與反序列化?如何實現Java序列化與反序列化?本文圍繞這些問題進行了探討。 1.Java序列化與反序列化 Java序列化是指把Java對象轉換為字節序
asp.net mvc中如何處理字符串與對象之間的序列化與反序列化(一)
osi strong 類結構 plain pbo edate inf esc arp 前臺我們一般用ajax來發送數據到後端進行處理,如果json數據結構和後臺的實體類結構一致,就直接可以反序列化為指定的對象進行操作,非常方便。 前端發送的json數據結構: 後端實體結
C#對象序列化與反序列化
space ros 個人信息 瀏覽器 特性 點名 文件名 屬性節點 派生 1.對象序列化的介紹 (1).NET支持對象序列化的幾種方式 二進制序列化:對象序列化之後是二進制形式的,通過BinaryFormatter類來實現的,這個類位於System.Runtime.Seri
Java將對象寫入文件讀出——序列化與反序列化
ansi print 成員 trace 對象的引用 ack lose 靜態 spa Java類中對象的序列化工作是通過ObjectOutputStream和ObjectInputStream來完成的。 寫入: 1 File aFile=new File(
畢業項目畢業 -- pickle序列化與反序列化操作
style import 使用 python pan 項目 imp 序列化 操作 Python可以使用pickle做序列化: 序列化示例: import picklewith open(‘les.pickle‘, ‘wb‘) as f: pickle.du
C#語言-08.序列化與反序列化
clas 本質 cnblogs 語法 信息 字段 使用 serializa col a. 序列化:是將對象的狀態存儲到特定存儲介質中的過程 i. 語法:public void Serialize(序列化過程的文件流,保存的對象)
Day4 閉包、裝飾器decorator、叠代器與生成器、面向過程編程、三元表達式、列表解析與生成器表達式、序列化與反序列化
反序 bsp pic nbsp tor 序列 space 列表解析 列表 http://pic.cnhubei.com/space.php?uid=1774&do=album&id=1362489http://pic.cnhubei.com/space.ph
01. Java對象的序列化與反序列化簡介
語音 log -c object height 通訊 圖片 二進制 進程 Java對象的序列化與反序列化 ; 給大家講解一下什麽是序列化 & 反序列化 當兩個進程進行遠程通訊的時候,彼此相互可以發送各種類型的數據,如文本,圖片,語音和視頻等無論是任何
如何使用 JSON for Modern C++ 序列化與反序列號,換行符導致序列化失敗
http gb2 elf ldp c++ spi ssp 使用 b16 W48z士5742i4鍁鉀http://shequ.docin.com/qbvl66336 6j夠裝何掖tj嘔蔡5VLhttp://tushu.docin.com/olybb166 渤k搶97L巳綱鋅7
單例模式序列化與反序列化
int nts 如果 mex res tac tor cep ios package com.wz.thread.resolve;import java.io.ObjectStreamException;import java.io.Serializable;/** * 序
python-序列化與反序列化
ret bject 通用 for pla nco ray 字典 read 序列化模塊# 序列化方法# 格式轉換# 把python中的數據轉換成str---序列化# 可以str轉換成python的數據---反序列化 json模塊 # json所有的語言都通用,它能序列化的數
模塊講解----json模塊(跨平臺的序列化與反序列化)
/usr 列表 strong 序列化 類型轉換 min 字符 虛擬 json 一、json的特點 1、只能處理簡單的可序列化的對象;(字典,列表,元祖) 2、json支持不同語言之間的數據交互;(python - go,python - java) 二、使用場
【轉】C# 序列化與反序列化
使用 ria tle 輸入 == 必須 mls zab ddr 轉自:https://www.cnblogs.com/lsy131479/p/8371858.html 對象持久化到文本文件,策略是:將對象的屬性值打散,拆解,分別存儲。 序列化: 保存對象的"全景圖" 序
JSON序列化與反序列化
class a using demo pos define sys ali convert lose 1.add reference [System.Runtime.Serializatio] 2.using [System.Runtime.Serialization] a
C#序列化與反序列化
color bsp private start sys bin create body null 一、序列化: 1 public void SerilizeData() 2 { 3 FileStream fs =