晕了我呀 发表于 2009-1-6 11:19:35

java初学者实践教程23-序列化

上节课我们讲了4种流,只有序列化的这个没有细讲。它是传对象的,如果想把一个对象保存在硬盘上,就只能使用这种方式。它的关键是将它的状态以一种串行格式表示出来,以便以后读该对象时能够把它读出来。对象的串行化对于大多数java应用是非常重要的:
u       Java的远程方法调用(RMI),通过socket通信。这个东西我们会在后面的教程讲到。
u       对象永久化,就是把对象存硬盘上,或外存设备上。以便以后使用。
它的基础类是ObjectInputStream和ObjectOutputStream,这两个流称为对象流。
      实践:





//这是一个保存对象的例子
import java.io.*;
import java.util.Date;
public class SerializeDate {
SerializeDate() {
    Date d = new Date ();
    try {
      FileOutputStream f =   
          new FileOutputStream ("date.ser"); //输出到date.ser这个文件中
      ObjectOutputStream s =   
          new ObjectOutputStream (f);
      s.writeObject (d); //写对象,将对象d写成是date.ser文件
      s.close ();      //关闭流
    } catch (IOException e) {
      e.printStackTrace ();
    } }
public static void main (String args[]) {
    new SerializeDate();
}}   

如图所示23-1,执行之后


www.ad119.cn/bbs/attachments/basic/20090106/20091611185295377801.jpg

图23-1
   
在DOS窗口中没有看到结果,但是在这个文件夹内发现了一个date.ser的文件。它就是对象d写入磁盘的状态。如图23-2

www.ad119.cn/bbs/attachments/basic/20090106/200916111853077802.jpg

图23-2
那么保存了之后怎么在把这个date.ser文件读出来呢?
实践:





import java.io.*;
import java.util.Date;
public class UnSerializeDate {
UnSerializeDate () {
    Date d = null;
    try { //使用FileInputStream类
      FileInputStream f =   
          new FileInputStream ("date.ser");
      ObjectInputStream s =   
          new ObjectInputStream (f);
      d = (Date) s.readObject ();//读对象
      s.close ();
    } catch (Exception e) {
      e.printStackTrace (); }
    System.out.println(
      "从date.ser文件,读取Date对象 ");
    System.out.println("日期是: " d);
}
public static void main (String args[]) {
    new UnSerializeDate();
}}   
如图23-3所示读出时间

www.ad119.cn/bbs/attachments/basic/20090106/2009161118536277803.jpg
图23-3
上述源码打包下载
对于一个可以被序列化的类,它会实现一个Serializable的接口。那是个空接口,什么方法也没有只是一个标志而已。这在J2EE,(现在叫java EE)中,使用EJB时是非常重要的。如果大家以后能继续学习学到EJB的时候,再具体了解。
   
java初学者实践教程24-反射
   
查看原文>>
页: [1]
查看完整版本: java初学者实践教程23-序列化