Java序列化几点注意事项

序列化保存的是 对象的状态,而静态变量是 的状态。

1、基本类型的数据可以直接序列化

2、对象要被序列化,它的类必须要实现Serializable接口;如果一个类中有引用类型的实例变量,这个引用类型也要实现Serializable接口。

3、可以用这个代码: ObjectOutputStream out  =  new  ObjectOutputStream( new  FileOutputStream("seria"));
但是不能用这个代码 ObjectOutputStream out  =  new  ObjectOutputStream( new  FileOutputStream("seria",true));

4、如果对象的引用类型没有实现序列化,但是还是想将这个对象序列化,那么可以将对象中用到的那个引用类型对象设置为transient类型。
如果A包含了对B的引用,那么在序列化A的时候也会将B一并地序列化;如果此时A可以序列化,B无法序列化,那么在序列化A的时候就会发生异常,这时就需要将对B的引用设为 transient ,该关键字表示变量不会被序列化。

5、如果用transient修饰引用类型对象,则这个引用类型的对象不会保存,那么如果希望保存下来又如何实现呢?
用这两段儿代码:
     private transient Book book;//用transient关键字声明book
	 //这个方法会在序列化的过程中被调用   
	     private void writeObject(ObjectOutputStream out){  
	         try {  
	             out.defaultWriteObject(); //这个方法会把这当前中非静态变量和非transient变量写到流中  
	                                       //在这里我们就把name写到了流中。  
	             //因为我们要保存Book的状态,所以我们还要想办法把其状态写入流中  
	             out.writeInt(book.getIsbn());//ObjectOutputStream中提供了写基本类型数据的方法  
	             //out.close();//注意,这句千万不能有,否刚将直接导致写入失败  
	         } catch (IOException e) {  
	             e.printStackTrace();  
	         }   
	     }  
	       
	     //这个方法会在反序列化的过程中被调用  
	     private void readObject(ObjectInputStream in){  
	         try {  
	             in.defaultReadObject(); //和defaultWriteObject()方法相对应,默认的反序列化方法,会从流中读取  
	                                     //非静态变量和非transient变量  
	             int isbn  = in.readInt(); //用这个方法来读取一个int型值,这里我们是读取书号  
	             book  = new Book(isbn); //这里我们就通过读取的 保存的状态构造 了一个和原来一样的Book对象  
	             //in.close();同样的这句也不能有  
	         } catch (IOException e) {  
	             e.printStackTrace();  
	         } catch (ClassNotFoundException e) {  
	             e.printStackTrace();  
	         }  
	     } 


6、如果一个类没有实现Serializable接口,但是它的父类实现了,那么这个类也可以序列化。

7、如果一个类实现了Serializable接口,但是它的父类没有实现,那么这个类可以进行序列化吗?
答案是可以的,因为超类Object类没有实现Serializable接口,所以你懂了吧,但是会有个问题,你需要在父类中是实现默认的构造方法,否则会报异常: no validconstructor。




  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值