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();
}
* 从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();
}
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