java对象的持久化(非ORM)

java对象的持久化
    对象的持久化讲得很多,一般是Hibernate等的ORM(object/relational mapping 对象-关系型数据库映射)。
    但是有时候,我们没法将对象映射到数据库的表的某个字段,但又要将这个对象的运行状态保存下来,当然可以保存到文件,但保存到文件的话以后查找麻烦,考虑保存到数据库,应怎么办?
    总体来说,是一个将对象序列化成流,字节流,字节数组,然后存入数据库的blob。获取时从数据库blob取得输入流,反序列化成对象。
    我们可以通过ObjectOutputStream以及ByteArrayOutputStream将对象转换成字节数组,存入数据库的blob字段。
    /**
    * 从object取得byte[]
    */
    public static byte[] getByteArrayFromObject(Object obj) {
      ByteArrayOutputStream byteArrayOutputStream =
      new ByteArrayOutputStream();
      try {
        ObjectOutputStream objectOutputStream =
        new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(obj);
      } catch (IOException e) {
        System.out.println("创建ObjectOutputStream失败!信息:" + e.getMessage());
        e.printStackTrace();
      }
      return byteArrayOutputStream.toByteArray();
    }
    取出时,可以从blob字段读取blob对象,然后取得InputStream,然后由InputStream创建ObjectInputStream,调用ObjectInputStream的readobject()方法得到对象。
    Blob blobobject = rs.getBlob("reportobject");
    InputStream inputStream = blobobject.getBinaryStream();
    try {
     objInputStream = new ObjectInputStream(inputStream);
    } catch (IOException e) {
     System.out.println("创建ObjectInputStream出错,信息:"+e.getMessage());
     e.printStackTrace();
    }
    try {
     savObj = (SaveObject)objInputStream.readObject();
    } catch (IOException e) {
     System.out.println("从objInputStream读取对象io错误,信息:"+e.getMessage());
     e.printStackTrace();
    } catch (ClassNotFoundException e) {
     System.out.println("从objInputStream读取对象classNotFound错误,信息:"+e.getMessage());
     e.printStackTrace();
    }
    以上仅作参考,大家共同学习。
                                                                                         xiongfei.xu 20060921
                                                                                          wjrcb 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值