哈哈,实现Serializable 的目的,是实现UserData 实例对象的可序列化,也就是说,可以把对象转换成Byte表示的文件。具体解释我给你查下!

解决方案 »

  1.   

    它面向那些实现了Serializable接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回原来的样子。这一过程亦可通过网络进行。这意味着序列化机制能自动补偿操作系统间的差异。换句话说,可以先在Windows机器上创建一个对象,对其序列化,然后通过网络发给一台Unix机器,然后在那里准确无误地重新“装配”。不必关心数据在不同机器上如何表示,也不必关心字节的顺序或者其他任何细节。
    就其本身来说,对象的序列化是非常有趣的,因为利用它可以实现“有限持久化”。请记住“持久化”意味着对象的“生存时间”并不取决于程序是否正在执行——它存在或“生存”于程序的每一次调用之间。通过序列化一个对象,将其写入磁盘,以后在程序重新调用时重新恢复那个对象,就能圆满实现一种“持久”效果。之所以称其为“有限”,是因为不能用某种“persistent”(持久)关键字简单地地定义一个对象,并让系统自动照看其他所有细节问题(尽管将来可能成为现实)。相反,必须在自己的程序中明确地序列化和组装对象。
    语言里增加了对象序列化的概念后,可提供对两种主要特性的支持。Java 1.1的“远程方法调用”(RMI)使本来存在于其他机器的对象可以表现出好象就在本地机器上的行为。将消息发给远程对象时,需要通过对象序列化来传输参数和返回值。RMI将在第15章作具体讨论。
    对象的序列化也是Java Beans必需的,后者由Java 1.1引入。使用一个Bean时,它的状态信息通常在设计期间配置好。程序启动以后,这种状态信息必须保存下来,以便程序启动以后恢复;具体工作由对象序列化完成。
    对象的序列化处理非常简单,只需对象实现了Serializable接口即可(该接口仅是一个标记,没有方法)。在Java 1.1中,许多标准库类都发生了改变,以便能够序列化——其中包括用于基本数据类型的全部封装器、所有集合类以及其他许多东西。甚至Class对象也可以序列化(第11章讲述了具体实现过程)。
    为序列化一个对象,首先要创建某些OutputStream对象,然后将其封装到ObjectOutputStream对象内。此时,只需调用writeObject()即可完成对象的序列化,并将其发送给OutputStream。相反的过程是将一个InputStream封装到ObjectInputStream内,然后调用readObject()。和往常一样,我们最后获得的是指向一个上溯造型Object的句柄,所以必须下溯造型,以便能够直接设置。
    对象序列化特别“聪明”的一个地方是它不仅保存了对象的“全景图”,而且能追踪对象内包含的所有句柄并保存那些对象;接着又能对每个对象内包含的句柄进行追踪;以此类推。我们有时将这种情况称为“对象网”,单个对象可与之建立连接。而且它还包含了对象的句柄数组以及成员对象。若必须自行操纵一套对象序列化机制,那么在代码里追踪所有这些链接时可能会显得非常麻烦。在另一方面,由于Java对象的序列化似乎找不出什么缺点,所以请尽量不要自己动手,让它用优化的算法自动维护整个对象网。下面这个例子对序列化机制进行了测试。它建立了许多链接对象的一个“Worm”(蠕虫),每个对象都与Worm中的下一段链接,同时又与属于不同类(Data)的对象句柄数组链接://: Worm.java
    // Demonstrates object serialization in Java 1.1
    import java.io.*;class Data implements Serializable {
      private int i;
      Data(int x) { i = x; }
      public String toString() {
        return Integer.toString(i);
      }
    }public class Worm implements Serializable {
      // Generate a random int value:
      private static int r() {
        return (int)(Math.random() * 10);
      }
      private Data[] d = {
        new Data(r()), new Data(r()), new Data(r())
      };
      private Worm next;
      private char c;
      // Value of i == number of segments
      Worm(int i, char x) {
        System.out.println(" Worm constructor: " + i);
        c = x;
        if(--i > 0)
          next = new Worm(i, (char)(x + 1));
      }
      Worm() {
        System.out.println("Default constructor");
      }
      public String toString() {
        String s = ":" + c + "(";
        for(int i = 0; i < d.length; i++)
          s += d[i].toString();
        s += ")";
        if(next != null)
          s += next.toString();
        return s;
      }
      public static void main(String[] args) {
        Worm w = new Worm(6, 'a');
        System.out.println("w = " + w);
        try {
          ObjectOutputStream out =
            new ObjectOutputStream(
              new FileOutputStream("worm.out"));
          out.writeObject("Worm storage");
          out.writeObject(w);
          out.close(); // Also flushes output
          ObjectInputStream in =
            new ObjectInputStream(
              new FileInputStream("worm.out"));
          String s = (String)in.readObject();
          Worm w2 = (Worm)in.readObject();
          System.out.println(s + ", w2 = " + w2);
        } catch(Exception e) {
          e.printStackTrace();
        }
        try {
          ByteArrayOutputStream bout =
            new ByteArrayOutputStream();
          ObjectOutputStream out =
            new ObjectOutputStream(bout);
          out.writeObject("Worm storage");
          out.writeObject(w);
          out.flush();
          ObjectInputStream in =
            new ObjectInputStream(
              new ByteArrayInputStream(
                bout.toByteArray()));
          String s = (String)in.readObject();
          Worm w3 = (Worm)in.readObject();
          System.out.println(s + ", w3 = " + w3);
        } catch(Exception e) {
          e.printStackTrace();
        }
      }
    } ///:~