对象序列化与反序列化实例

之前我整理过一篇关于对象序列化的博文,今天在一本教材上看到了一些关于对象序列化的内容,所以想把它写下来加深印象

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();
		}
	}
发布了118 篇原创文章 · 获赞 59 · 访问量 49万+

猜你喜欢

转载自blog.csdn.net/u012255097/article/details/103951613