之前我整理过一篇关于对象序列化的博文,今天在一本教材上看到了一些关于对象序列化的内容,所以想把它写下来加深印象
1.对象序列化就是将Object转换成byte序列,反之就是对象反序列化
1)序列化流(ObjectOutputStream),是过滤流
ObjectOutputStream writeObject(Object)序列化对象
ObjectInputStream readObject() 对象反序列化
2)序列化接口(Serializable)
对象必须实现“序列化接口”才能进行序列化,否则将会出现不能序列化的异常!
Serializable是一个空的接口,没有任何方法,仅做为一个序列化的标识
3)javaBean规范规定,java类必须实现Serializable接口
java API中的类大多是符合java Bean规范的,基本都实现了Serializable
4)对象的序列化和反可以变相实现对象的深层复制
案例1:
public static void main(String[] args) throws Exception {
String file ="F:/temp/obj.dat";
//1.对象序列化
FileOutputStream fos=new FileOutputStream(file);
ObjectOutputStream out=new ObjectOutputStream(fos);
Foo foo=new Foo();
foo.setAge("12");
foo.setSex("男");
Foo f2=new Foo();
f2.setAge("24");
f2.setSex("女");
out.writeObject(foo);//序列化,将对象写入到流中
out.writeObject(f2);
out.close();
//2.对象的反序列化
FileInputStream fis=new FileInputStream(file);
ObjectInputStream in=new ObjectInputStream(fis);
Foo f=(Foo) in.readObject();
Foo ff=(Foo) in.readObject();
System.out.println(f.getAge()+" ;;"+ff.getAge());
//f是foo的深层复制
System.out.println(f==foo);//false
in.close();
}
2. 浅层复制与深层复制 *
1) Java 的默认复制规则是浅层复制, 性能好, 但隔离性差。浅层复制现象, 只复制第一层对象
2) 利用序列化可以实现深层复制
案例2:
public static Object deppClone(Object obj) throws Exception{
try {
//1.对象序列化
//缓冲流:字节数组输出流
ByteArrayOutputStream buf=new ByteArrayOutputStream();
//对象输出流
ObjectOutputStream out =new ObjectOutputStream(buf);
out.writeObject(obj);//序列化对象到buf中
out.close();
//2.对象反序列化
byte[]ary =buf.toByteArray();
ByteArrayInputStream bais=new ByteArrayInputStream(ary);
ObjectInputStream in=new ObjectInputStream(bais);
Object o=in.readObject();//从ary反序列化
in.close();
return o;
} catch (Exception e) {
e.printStackTrace();
throw new Exception();
}
}