对象序列化的目标是将对象保存到磁盘中或允许在网络中直接传输对象,对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久保存在磁盘上,通过网络将这种二进制流传输到另一个网络节点。其他程序一旦获得了这种二进制流(无论是从磁盘中获取,还是通过网络获取),都可以将这种二进制流恢复成原来的Java对象。
序列化机制允许将实现序列化的Java对象转换为字节序列,这些字节序列可以被保存在磁盘上,或通过网络传输,以备以后重新恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。
对象的序列化是指将一个Java对象写入IO流中,与此对应的是,对象的反序列化则指从IO流中恢复该Java对象。
如果需要让某个对象可以支持序列化机制,必须让它的类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:
1.Serializable
2.Externlizable
Java的很多类以及实现了Serializable,该接口是一个标记接口,实现该接口无须实现任何方法,它只是表明该类的实例是可序列化的。
所有可能在网络上传输的对象的类都应该是可序列化的,否则程序将会出现异常,比如RMI(远程方法调用)过程中的参数和返回值;所有需要保存到磁盘里的对象的类都必须可序列化。比如Web应用中需要保存到HttpSession或ServletContext属性的Java对象。
因为序列化是RMI过程的参数和返回值都必须实现的机制,而RMI又是JavaEE技术基础,所有分布式应用常常需要跨平台、跨网络,因此要求所有传递的参数、返回值必须实现序列化。因此序列化机制是Java EE平台的基础。通常建议:程序创建的每个JavaBean类都实现Serializable
2 使用对象流实现序列化
如果需要将某个对象保存到磁盘上或者通过网络传输,那么这个类应该实现Serializable接口或者Externalizable接口之一,关于这两个接口的区别和联系,后面有更详细介绍。
使用Serializable来实现序列化非常简单,主要让目标类实现Serializable标记接口即可,无须实现任何方法。
一旦某个类实现了Serializable接口,则该类的对象就是可序列化的,程序可以通过如下两个步骤来序列化该对象:
1.创建一个ObjectOutputStream,这个输出流是一个处理流,所以必须建立在其他节点流的基础之上。 //创建一个ObjectOutputStream输出流 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.txt")); 2.调用ObjectOutputStream对象的writeObject方法输出可序列化对象 //将一个Person对象输出到输出流中 oos.write(per);