Robin's Blog

记录 积累 学习 成长

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

把Java对象序列化成二进制流存储到DB,再从DB反序列化回对象

package examples.development.applications;


import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.ObjectInputStream;

import java.io.ObjectOutputStream;

import java.io.Serializable;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;


public class Transformer {

public static void main(String[] args) throws IOException, ClassNotFoundException {

String hexString = "ACED0005757200135B4C6A6176612E6C616E672E4F626A6563743B90CE589F1073296C020000787000000003757200025B4A782004B512B1759302000078700000000200000000EB80809200000000EB80809370757200025B443EA68C14AB635A1E0200007870000000023FF4CF39C3BD29BD3FF4CF39C3BD29BD";

byte[] b = hexStringToByte(hexString);

Object o = bytesToObject(b);

Object[] os = (Object[])o;

double[] ds = (double[])os[2];

System.out.println(ds[0]+" , "+ds[1]);

}

// 十六进制字符串转化成字节数组

public static byte[] hexStringToByte(String hex) { 

   int len = (hex.length() / 2); 

   byte[] result = new byte[len]; 

   char[] achar = hex.toCharArray(); 

   for (int i = 0; i < len; i++) { 

    int pos = i * 2; 

    result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1])); 

   } 

   return result; 

private static byte toByte(char c) { 

   byte b = (byte) "0123456789ABCDEF".indexOf(c); 

   return b; 

/** *//** 

   * 把字节数组转换成16进制字符串 

   * @param bArray 

   * @return 

   */ 

public static final String bytesToHexString(byte[] bArray) { 

   StringBuffer sb = new StringBuffer(bArray.length); 

   String sTemp; 

   for (int i = 0; i < bArray.length; i++) { 

    sTemp = Integer.toHexString(0xFF & bArray[i]); 

    if (sTemp.length() < 2) 

     sb.append(0); 

    sb.append(sTemp.toUpperCase()); 

   } 

   return sb.toString(); 

/** *//** 

   * 把字节数组转换为对象 

   * @param bytes 

   * @return 

   * @throws IOException 

   * @throws ClassNotFoundException 

   */ 

public static final Object bytesToObject(byte[] bytes) throws IOException, ClassNotFoundException { 

   ByteArrayInputStream in = new ByteArrayInputStream(bytes); 

   ObjectInputStream oi = new ObjectInputStream(in); 

   Object o = oi.readObject(); 

   oi.close(); 

   return o; 

/** *//** 

   * 把可序列化对象转换成字节数组 

   * @param s 

   * @return 

   * @throws IOException 

   */ 

public static final byte[] objectToBytes(Serializable s) throws IOException { 

   ByteArrayOutputStream out = new ByteArrayOutputStream(); 

   ObjectOutputStream ot = new ObjectOutputStream(out); 

   ot.writeObject(s); 

   ot.flush(); 

   ot.close(); 

   return out.toByteArray(); 

public static final String objectToHexString(Serializable s) throws IOException{ 

   return bytesToHexString(objectToBytes(s)); 

public static final Object hexStringToObject(String hex) throws IOException, ClassNotFoundException{ 

   return bytesToObject(hexStringToByte(hex)); 

/** *//** 

   * @函数功能: BCD码转为10进制串(阿拉伯数据) 

   * @输入参数: BCD码 

   * @输出结果: 10进制串 

   */ 

public static String bcd2Str(byte[] bytes){ 

   StringBuffer temp=new StringBuffer(bytes.length*2); 

   for(int i=0;i<bytes.length;i++){ 

    temp.append((byte)((bytes[i]& 0xf0)>>>4)); 

    temp.append((byte)(bytes[i]& 0x0f)); 

   } 

   return temp.toString().substring(0,1).equalsIgnoreCase("0")?temp.toString().substring(1):temp.toString(); 

/** *//** 

   * @函数功能: 10进制串转为BCD码 

   * @输入参数: 10进制串 

   * @输出结果: BCD码 

   */ 

public static byte[] str2Bcd(String asc) { 

   int len = asc.length(); 

   int mod = len % 2; 

   if (mod != 0) { 

    asc = "0" + asc; 

    len = asc.length(); 

   } 

   byte abt[] = new byte[len]; 

   if (len >= 2) { 

    len = len / 2; 

   } 

   byte bbt[] = new byte[len]; 

   abt = asc.getBytes(); 

   int j, k; 

   for (int p = 0; p < asc.length()/2; p++) { 

    if ( (abt[2 * p] >= '0') && (abt[2 * p] <= '9')) { 

     j = abt[2 * p] - '0'; 

    } else if ( (abt[2 * p] >= 'a') && (abt[2 * p] <= 'z')) { 

     j = abt[2 * p] - 'a' + 0x0a; 

    } else { 

     j = abt[2 * p] - 'A' + 0x0a; 

    } 

    if ( (abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9')) { 

     k = abt[2 * p + 1] - '0'; 

    } else if ( (abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z')) { 

     k = abt[2 * p + 1] - 'a' + 0x0a; 

    }else { 

     k = abt[2 * p + 1] - 'A' + 0x0a; 

    } 

    int a = (j << 4) + k; 

    byte b = (byte) a; 

    bbt[p] = b; 

   } 

   return bbt; 

// /** *//** 

//    * @函数功能: BCD码转ASC码 

//    * @输入参数: BCD串 

//    * @输出结果: ASC码 

//    */ 

// public static String BCD2ASC(byte[] bytes) { 

//    StringBuffer temp = new StringBuffer(bytes.length * 2); 

//

//    for (int i = 0; i < bytes.length; i++) { 

//     int h = ((bytes[i] & 0xf0) >>> 4); 

//     int l = (bytes[i] & 0x0f);   

//     temp.append(BToA[h]).append( BToA[l]); 

//    } 

//    return temp.toString() ; 

//

/** *//** 

   * MD5加密字符串,返回加密后的16进制字符串 

   * @param origin 

   * @return 

   */ 

public static String MD5EncodeToHex(String origin) { 

      return bytesToHexString(MD5Encode(origin)); 

    } 

/** *//** 

   * MD5加密字符串,返回加密后的字节数组 

   * @param origin 

   * @return 

   */ 

public static byte[] MD5Encode(String origin){ 

   return MD5Encode(origin.getBytes()); 

/** *//** 

   * MD5加密字节数组,返回加密后的字节数组 

   * @param bytes 

   * @return 

   */ 

public static byte[] MD5Encode(byte[] bytes){ 

   MessageDigest md=null; 

   try { 

    md = MessageDigest.getInstance("MD5"); 

    return md.digest(bytes); 

   } catch (NoSuchAlgorithmException e) { 

    e.printStackTrace(); 

    return new byte[0]; 

   } 

 

//关于byte:    signed byte 把 0x00 ~ 0xff 映射成范围 0~127和 -128~-1    两段,比较简单的办法用 (b+256)%256的办法令其值回到0~255,或者用&0xff并赋给一个int。参考http://www.jsfsoft.com:8080/beyond-pebble/pinxue/2006/08/23/1156309692525.html

}


posted on 2010-11-16 17:34  Robin99  阅读(1277)  评论(0编辑  收藏  举报