java对象序列化的方法
java对象序列化的方法
java对象序列化概述
序列化的过程就是对象写入字节流和从字节流中读取对象。
将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存在文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机。
对象序列化功能可应用在RMI/Socket/JMS/EJB
简化了对象持久化(Persistence)的实现
XML序列化指的是把对象转换成XML数据,传输到目的地后再把XML数据反序列化为对象。
对象序列化实用意义
对象序列化可以实现分布式对象。RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的“深复制”,即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。
java序列化的实现
java序列化比较简单,实现Serializable接口的类对象可以转换成字节流或从字节流恢复,不需要在类中增加任何代码。只有极少数情况下才需要定制代码保存或恢复对象状态。
Serializable是标志性接口,不具有方法。注意:不是每个类都可以序列化,有些类是不能序列化的,例如涉及线程的类与特定JVM有非常复杂的关系。
java库中的类,如String,都实现了Serializable接口,所以他们都可进行serialization操作。
对一个对象进行Serialize操作时,不仅会把对象在内存中的数据保存下来,还会把对象中所包含的可serialize成员对象也保存下来。如果对象中包含了没有实现Serializable接口的成员对象,那将在尝试对对象进行Serialize操作时,将发生错误。
对一个Serializable对象进行次第读取时,并不会调用任何构造函数。这是因为对象中的所有数据都是通过InputStream读取的数据来恢复的,所有不用通过构造函数来进行初始化。
进行序列读取时,在执行读取操作的class 中一定要能找到相应的class文件。
处理对象流
java.io包有两个序列化对象的类。
A. ObjectOutputStream
将对象写入字节流
存储对象writeObject()
B. ObjectInputStream
从字节流重构对象
恢复对象readObject()
ObjectOutputStream类
ObjectOutputStream扩展DataOutput接口writeObject()方法用语对象序列化。如果对象包含其它对象的引用,则writeObject()方法递归序列化这些对象,每个ObjectOutputStream维护序列化的对象引用表,防止发送同一对象的多个拷贝。由于writeObject()可以序列化整组交叉引用的对象,因此同一ObjectOutputStream实例可能不小心被请求序列化同一对象。这时,进行反引用序列化,而不是再次写入对象字节流。
序列化today's date到一个文件中。
ObjectOutputStreams=newObjectOutputStream(f);
s.writeObject("Today");
s.writeObject(newDate());
s.flush();
//flush()在方法返回前显示清空输出缓冲区