系列化的过程就是对象写入字节流和从字节流中读取对象.
将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管理到另一线程中或通过网络连接将对象数据发送到另一主机.(XML系列化指的是把对象转换成XML数据,传输到目的地后再把XML数据反序列化为对象)
对象系列化可以实现分布式对象.RMI要利用对象系列化运行运程主机上的服务,就像在本地机上运行对象时一样.
Java对象系列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据.可以将整个对象层次希尔字节流中,可以保存在文件中或在网络连接上传递.利用对象系列化可以进行对象的“深复制”,即复制对象本身及引用的对象本身.系列化一个对象可能得到整个对象系列.
Java系列化比较简单,实现Serializable接口的类对象可以转换成字节流或从字节流恢复,不需要在类中增加任何代码.只有极少数情况下才需要定制代码保存或恢复对象状态.
Serializable是标志性接口,不具有方法.
注意:不是每个类都可系列化,有些类是不能系列化的,例如涉及吸纳长的类与特定JVM有非常复杂的关系.
Java库中的类,如String,都实现了Serializable 接口,所以它们都可以进行Serialization操作.
对一个对象进行Serialization 操作时,不仅会把对象在内存中的数据保存下来,还会把对象中所包含的可Serialization成员对象也保存下来,.如果对象中包含了没有实现Serializable接口的成员对象,那将在尝试对对象进行Serializable操作时,将发生错误!
对一个Serializable对象进行次第读取时,并不会调用任何构造函数(包含default函数).这是因为对象中的所有数据都是通过InputStream读取的数据来恢复的,所有不用通过构造函数来进行初始化.
进行系列读取时,在执行读取操作的class中一定要能找到相应的class文件.
系列化:将数据分解成字节流,以便存储在文件中或在网络上传输.
反序列化:打开字节流并重构对象.
对象系列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据.恢复数据要求有恢复数据的对象实例.ObjectOutputStream中的系列化过程与字节流连接,包含对象类型和版本信息.反序列化时,JVM用头信息生成对象实例,然后将对象字节流中的数据复制到对象数据成员中.
对象系列化:
FileOutputStream f=new FileOutputStream("D:\\simple.txt"); ObjectOutputStream s=new ObjectOutputStream(f); s.writeObject("Today"); s.writeObject(new Date()); s.flush();//在方法返回前显式清空输出缓冲区!
对象反序列化:
FileInputStream in=new FileInputStream("D:\\simple.txt"); ObjectInputStream s=new ObjectInputStream(in); String today=(String)s.readObject(); Date data=(Date)s.readObject(); System.out.println(today); System.out.println(data);