扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
Java中对象的序列化(serialization)允许把采用Serializable接口的任何对象转换成字节流序列;同时它也允许把字节流序列转换回对象本身。其机制不依赖于操作系统,也就是说,你可以通过网络传递该对象,并在网络连线的另一端把它们恢复。
使用sterilization,你可以很容易实现所谓的“lightweight persistence”(轻量级持久化),让对象的生命周期超越程序的生命周期。Serializtion机制被引入到Java语言中来有两个原因:(1)JavaBeans机制用到了serialization,及(2)远程方法调用(RMI)允许你自动使用位于网络另一端的对象,就如同使用本地对象一般。
Serializable 接口
很容易把任何采用Serializable接口的对象进行序列化。这个接口不包含任何方法,所以它对于编译器和Java 虚拟机(JVM)而言不过是一个标记,向它们声明自己是可以被序列化的。自从序列化机制引入到这种语言之后,许多标准Java类(所有的原始类型封装类,如Integer类和Double类,所有的容器类,和Class类)都重新进行了修改以支持序列化。
为了序列化一个对象,你需要用到输出流OutputStream,OutputStream必需被放入特殊的称作ObjectOutputStream的序列化流中。然后,你只需要调用方法writeObject()来序列化对象并发送到输出流中。为了反序列化一个对象,你需要把InputStream转化进ObjectInputStream中,然后调用readObject()方法。和往常一样,你需要得到一个对象的引用,所以你也得构造所需类型的对象的class cast。
序列化机制可以正确处理对象包含的所有引用。所有含有实时引用的连接对象也会被序列化,就如同所有连接对象的所有连接对象,以此类推。这有时被叫作对象网络。清单A向你显示了如何反序列化一个对象。
清单A
import java.io.*;
public class Data implements Serializable {
public static void main(String[] args)
throws ClassNotFoundException, IOException {
Data d = new Data();
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("data.out"));
out.writeObject("Data storage");
out.writeObject(d);
out.close();
ObjectInputStream in = new ObjectInputStream(
new FileInputStream("data.out"));
String s = (String)in.readObject();
Data d2 = (Data)in.readObject();
}
}
在你创建了一个ObjectOutputStream(基于另外一个输出流)之后,writeObject()方法把对象写入该流。注意我把字符串对象写入了流,之后又轻松地对它进行了反序列化操作。JVM会看管好对象长度,所以不要担心对象的尺寸和结构。你可以把对象写入任何流;例如,RMI把对象写入到网络流中。同时需要注意,反序列化过程中不调用任何方法,包括构造器函数。
寻找类
让我们假设你把一个对象传进了另一台主机。那么它是否真的能够根据从网络接收到的信息,在那里重构而使用呢?能,完全可以,但只有当JVM知道该对象的类之后才行。
在清单B中,我从文件中读取序列化了的对象,然后试图通过一个类的getClass()方法得到它的类。如果返回的类不包括在classpath之中,那么函数将抛出ClassNotFoundException例外。
清单B
import java.io.*;
public class GetAlienClass {
public static void main(String[] args)
throws IOException, ClassNotFoundException {
ObjectInputStream in = new ObjectInputStream(
new FileInputStream("alien.obj"));
Object obj = in.readObject();
// Here you will get ClassNotFoundException
System.out.println(obj.getClass());
}
}
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者