最近在寫通信項目的時候遇到了個最主要的問題缴罗,用java寫客戶端的時候,與服務(wù)端進行通信的時候不能直接傳json或者是對象祭埂,只能用byte數(shù)組面氓,這時候就需要將對象轉(zhuǎn)換為byte數(shù)組
必須注意的一點啊:bytes在反序列化為Object的前提是byte[]是通過ObjectOutputStream序列化的,也就是說序列化和反序列化是有格式的舌界,并不是一個隨便的byte數(shù)組就能被反序列化的
1.什么是序列化呢呵反序列化呢掘譬?
序列化:指把堆內(nèi)存中的java對象數(shù)據(jù),通過某種方式傳遞給 某個網(wǎng)絡(luò)節(jié)點禀横,(在網(wǎng)絡(luò)上傳輸)屁药,這個過程就叫做序列化粥血。通俗即為將數(shù)據(jù)結(jié)構(gòu)或?qū)ο筠D(zhuǎn)換為二進制串的過程
反序列化:把磁盤文件中的對象數(shù)據(jù)或者網(wǎng)絡(luò)節(jié)點上的對象數(shù)據(jù)(即二進制數(shù)據(jù))柏锄,轉(zhuǎn)換為java對象模型的過程
2.java怎么進行序列化呢?
a.需要做序列化的類复亏,必須實現(xiàn)序列化接口趾娃,java.lang.Serializable接口這是一個標志接口,沒有任何抽象方法)缔御,Java 中大多數(shù)類都實現(xiàn)了該接口抬闷,比如:String,Integer
b.底層會判斷耕突,如果當前對象是Serializable的實例笤成,才允許被序列化
c.java中使用對象流來實現(xiàn)序列化和反序列化
ObjectOutputStream:通過 writeObject()方法做序列化操作 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??ObjectInputStream:通過 readObject() 方法做反序列化操作
3.java中序列化和反序列化的接口類:
public class ObjectAndByte {
/**
* 對象轉(zhuǎn)數(shù)組
? ? * @param obj
? ? * @return
? ? */
? ? public byte[]toByteArray (Object obj) {
byte[] bytes =null;
? ? ? ? ByteArrayOutputStream bos =new ByteArrayOutputStream();
? ? ? ? try {
ObjectOutputStream oos =new ObjectOutputStream(bos);
? ? ? ? ? ? oos.writeObject(obj);
? ? ? ? ? ? oos.flush();
? ? ? ? ? ? bytes = bos.toByteArray ();
? ? ? ? ? ? oos.close();
? ? ? ? ? ? bos.close();
? ? ? ? }catch (IOException ex) {
ex.printStackTrace();
? ? ? ? }
return bytes;
? ? }
/**
* 數(shù)組轉(zhuǎn)對象
? ? * @param bytes
? ? * @return
? ? */
? ? public ObjecttoObject (byte[] bytes) {
Object obj =null;
? ? ? ? try {
ByteArrayInputStream bis =new ByteArrayInputStream (bytes);
? ? ? ? ? ? ObjectInputStream ois =new ObjectInputStream (bis);
? ? ? ? ? ? obj = ois.readObject();
? ? ? ? ? ? ois.close();
? ? ? ? ? ? bis.close();
? ? ? ? }catch (IOException ex) {
ex.printStackTrace();
? ? ? ? }catch (ClassNotFoundException ex) {
ex.printStackTrace();
? ? ? ? }
return obj;
? ? }
}