java中兩種常見的序列化方式

在遠程調用中,須要把參數和返回值經過網絡傳輸,這個使用就要用到序列化將對象轉變成字節流,從一端到另外一端以後再反序列化回來變成對象。java

既然前面有一篇提到了hessian,這裏就簡單講講Java序列化和hessian序列化的區別。網絡

首先,hessian序列化比Java序列化高效不少,並且生成的字節流也要短不少。但相對來講沒有Java序列化可靠,並且也不如Java序列化支持的全面。而之因此會出現這樣的區別,則要從它們的實現方式來看。測試

先說Java序列化,具體工做原理就不說了,Java序列化會把要序列化的對象類的元數據和業務數據所有序列化從字節流,並且是把整個繼承關係上的東西所有序列化了。它序列化出來的字節流是對那個對象結構到內容的徹底描述,包含全部的信息,所以效率較低並且字節流比較大。可是因爲確實是序列化了全部內容,因此能夠說什麼均可以傳輸,所以也更可用和可靠。code

而hessian序列化,它的實現機制是着重於數據,附帶簡單的類型信息的方法。就像Integer a = 1,hessian會序列化成I 1這樣的流,I表示int or Integer,1就是數據內容。而對於複雜對象,經過Java的反射機制,hessian把對象全部的屬性當成一個Map來序列化,產生相似M className propertyName1 I 1 propertyName S stringValue(大概如此,確切的忘了)這樣的流,包含了基本的類型描述和數據內容。而在序列化過程當中,若是一個對象以前出現過,hessian會直接插入一個R index這樣的塊來表示一個引用位置,從而省去再次序列化和反序列化的時間。這樣作的代價就是hessian須要對不一樣的類型進行不一樣的處理(所以hessian直接偷懶不支持short),並且遇到某些特殊對象還要作特殊的處理(好比StackTraceElement)。並且同時由於並無深刻到實現內部去進行序列化,因此在某些場合會發生必定的不一致,好比經過Collections.synchronizedMap獲得的map。對象

序列化是指將一個對象序列化成字節流,便於存儲或者網絡傳輸;而反序列化剛好相反,將字節流,變回一個對象.咱們日常用的比較多的是hessian序列化方式和java序列化方式,兩種序列化方式的效率,以及序列化大小是不同的,從測試結果看,hessian好一點.下面寫了一個hessian序列化示例(沒有文件IO與網絡IO,純粹序列化與反序列化):繼承

/**

 * 純hessian序列化

 * @param object

 * @return

 * @throws Exception

 */

public static byte[] serialize(Object object) throws Exception{

if(object==null){

throw new NullPointerException();

}

ByteArrayOutputStream os = new ByteArrayOutputStream();

HessianSerializerOutput hessianOutput=new HessianSerializerOutput(os);

hessianOutput.writeObject(object);

return os.toByteArray();

}

/**

 * 純hessian反序列化

 * @param bytes

 * @return

 * @throws Exception

 */

public static Object deserialize(byte[] bytes) throws Exception{

if(bytes==null){

throw new NullPointerException();

}

ByteArrayInputStream is = new ByteArrayInputStream(bytes);

HessianSerializerInput hessianInput=new HessianSerializerInput(is);

Object object = hessianInput.readObject();

return object;

}

另一種常見的是java序列化方式:string

/**

 * java序列化

 * @param obj

 * @return

 * @throws Exception

 */

public static byte[] serialize(Object obj) throws Exception {

if (obj == null)

throw new NullPointerException();

ByteArrayOutputStream os = new ByteArrayOutputStream();

ObjectOutputStream out = new ObjectOutputStream(os);

out.writeObject(obj);

return os.toByteArray();

}

/**

 * java反序列化

 * @param by

 * @return

 * @throws Exception

 */

public static Object deserialize(byte[] by) throws Exception {

if (by == null)

throw new NullPointerException();

ByteArrayInputStream is = new ByteArrayInputStream(by);

ObjectInputStream in = new ObjectInputStream(is);

return in.readObject();

}
相關文章
相關標籤/搜索