二進位制與物件之間的轉換
阿新 • • 發佈:2019-01-04
package com.sqfs.utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import lombok.extern.slf4j.Slf4j;
/**
* 物件和二進位制轉換工具類(參考: 深度克隆). 把一個物件存入redis的快取的時候需要把物件(要求物件實現序列化介面)轉成二進位制陣列,
* 從redis快取中吧資料取出的時候是一個二進位制資料組物件, 所以需要把二進位制資料轉換成原來的物件.
* @author LSZ
*/
@Slf4j
public final class DeepClone {
private DeepClone() {} /** * 把物件轉變成二進位制 * @param obj 待轉換的物件 * @return 返回二進位制陣列 */ public static byte[] writeInto(Object obj) { ByteArrayOutputStream bos = null; ObjectOutputStream oos = null; try { bos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(bos); //讀取物件並轉換成二進位制資料 oos.writeObject(obj); return bos.toByteArray(); } catch (IOException e) { log.warn("物件轉換成二級制資料失敗, {}", e); } finally { if(oos != null) { try { oos.close(); } catch (IOException e) { e.printStackTrace(); } } if(bos != null) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; } /** * 把二進位制陣列的資料轉回物件 * @param b * @return */ public static Object restore(byte[] b) { ByteArrayInputStream bis = null; ObjectInputStream ois = null; try { //讀取二進位制資料並轉換成物件 bis = new ByteArrayInputStream(b); ois = new ObjectInputStream(bis); return ois.readObject(); } catch (ClassNotFoundException | IOException e) { log.warn("二進位制資料轉回物件失敗, {}", e); } finally { if(ois != null) { try { ois.close(); } catch (IOException e) { e.printStackTrace(); } } if(bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; }
}