ITPub博客

首页 > IT职业 > IT图书 > 序列化控制

序列化控制

IT图书 作者:zhaosansan 时间:2018-10-05 09:46:10 0 删除 编辑

 当我们对序列化进行控制时,可能某个特定子对象不想让Java序列化机制自动保存与恢复。如果子对象表示的是我们不希望将其序列化的敏感信息(如密码),通常会面临这种情况。即使对象中的这些信息是private属性,一经序列化处理,人们就可以通过读取文件或者拦截网络传输的方式来访问到它。有两种办法可以防止对象的敏感部分被序列化:


  实现Externalizable代替实现Serializable接口来对序列化过程进行控制,Externalizable继承了Serializable接口,同时增添了两个方法:writeExternal()和readExternal()。


两者在反序列化时的区别:

  - 对Serializable对象反序列化时,由于Serializable对象完全以它存储的二进制位为基础来构造,因此并不会调用任何构造函数,因此Serializable类无需默认构造函数,但是当Serializable类的父类没有实现Serializable接口时,反序列化过程会调用父类的默认构造函数,因此该父类必需有默认构造函数,否则会抛异常。

  - 对Externalizable对象反序列化时,会先调用

iis7网站监控

类的不带参数的构造方法,这是有别于默认反序列方式的。如果把类的不带参数的构造方法删除,或者把该构造方法的访问权限设置为private、默认或protected级别,会抛出java.io.InvalidException: no valid constructor异常,因此Externalizable对象必须有默认构造函数,而且必需是public的。

  - Externalizable的替代方法:如果不是特别坚持实现Externalizable接口,那么还有另一种方法。我们可以实现Serializable接口,并添加writeObject()和readObject()的方法。一旦对象被序列化或者重新装配,就会分别调用那两个方法。也就是说,只要提供了这两个方法,就会优先使用它们,而不考虑默认的序列化机制。


  这些方法必须含有下列准确的签名:


  private void writeObject(ObjectOutputStream stream)  throws IOException;

  private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException


  - 可以用transient关键字逐个字段地关闭序列化,它的意思是“不用麻烦你保存或恢复数据—我自己会处理的”。由于Externalizable对象在默认情况下不保存它们的任何字段,所以transient关键字只能和Serializable对象一起使用。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31552536/viewspace-2215455/,如需转载,请注明出处,否则将追究法律责任。

上一篇: java内部类
请登录后发表评论 登录
全部评论

注册时间:2018-09-17

  • 博文量
    24
  • 访问量
    14441