1. 程式人生 > >二進位制與物件之間的轉換

二進位制與物件之間的轉換

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;
}

}