科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件学习何时序列化或外部化Java对象

学习何时序列化或外部化Java对象

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Java中对象的序列化(serialization)允许把采用Serializable接口的任何对象转换成字节流序列;同时它也允许把字节流序列转换回对象本身。

作者:builder.com.cn 2007年4月3日

关键字: javatrend java 外部化 序列化

  • 评论
  • 分享微博
  • 分享邮件

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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章