对象序列化

当你创建对象时,只要需要就会一直存在,但是在程序终止时,无论如何都会继续存在。
Java的对象序列化将那些实现了Serializable接口的对象转换为一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。这意味着序列化机制能够自动弥补不同操作系统之间的差异。
利用对象序列化可以实现轻量级持久性,“持久性”意味着对象的生存周期并不取决于程序是否正在执行;它可以生存于程序的调用之间,通过将一个序列化对象写入磁盘,然后再重新调用程序是恢复该对象,就能够实现持久性的效果。之所以称为“轻量级”是因为不能用“persistent”关键字简单的定义一个对象,并让系统自动为维护其他细节问题。
对象序列化主要是支持两种主要特性:一是Java的远程方法调用,时在其他计算机上的对象使用起来就像是存活于本机上一样。当向远程对象发送消息时,需要通过对象序列化来传输参数和返回值。
对于Java Beans,对象的序列化也是必须的,使用一个Bean时,一般情况下是在设计阶段对他的状态信息进行配置,这种状态信息必须保存下来并在程序启动时进行后期恢复。
要序列化一个对象,首先要创建某些OutputStream对象然后将其封装在一个ObjectOutputStream对象内。只需要调用writeObject()即可将对象序列化并将其发送给OutputStream。要反向进行该过程需要将一个InputStream封装在ObjectInputStream内,然后调用ReadObject()。
对象序列化不仅保存对象“全景图”,而且能最总对象内所包含的所有引用,并保存那些对象,接着能对对象内包含的每个这样的引用进行追踪。单个对象可与之建立连接,而且还包含对象的引用数组和成员对象。下面这个例子通过对连接的对象生成一个worm对序列化机制进行测试。每个对象都与worm中的下一段链接,同时与属于不同类的对象引用数组链接:
对象序列化
对象序列化
对象序列化Worm内的Data对象数组使用随机数组初始化的。每个Worm端都用一个char标记,该char是在递归生成连接的Worm列表时自动产生的。要创建一个Worm,必须告知构造器希望的长度。在产生下一个引用时要调用Worm构造器并将长度减1。组后一个next引用则为null,表示已到达Worm尾部。

  • 寻找类
    对象序列化
    该程序不但能捕获和处理异常,而且将异常抛出到main()方法之外,以便通过控制台产生报告。
    对象序列化
    打开文件和读取mystery对象中的内容都需要Alien的Class对象,java虚拟机找不到Alien.class。这样就会得到一个名为ClassNotFoundException异常。
  • 序列化的控制
    在一些特殊的情况下,可通过实现Externalizable接口代替实现Serializable接口,对序列化过程进行控制。这个Externalizable接口继承了Serializable接口,同时增添了两个方法:writeExternal()和readExternal()。这两个方法会在序列化和反序列化还原的过程中被自动调用。
    对于Serializable对象,对象完全以他存储的二进制位为基础来构造而不调用构造器。对于一个Externalizable对象,所有普通的默认构造器都会被调用,然后调用readExternal()。下面这个例子示范了如何完整保存和恢复一个Externalizable对象。
  • transient(瞬时)关键字
    当对序列化进行控制时,可能某个特定子对象不想让java的序列化机制自动保存与恢复。如果子对象表示我们不希望将其序列化的敏感信息,通常面临这种情况。既是对对象中的这些信息是private属性,经过序列化处理,可以通过读取文件或拦截网络传输的方式来访问到它。
    一种方法可以防止对象的敏感部分被序列化,就是将类实现为Externalizable,这样没有任何东西可以自动序列化,并且可以在writeExternal()内部只对所需部分进行显示的序列化