下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

Java程序中可以只用文件目录来重新构造对象吗?

作者:课课家教育     来源: http://www.kokojia.com点击数:987发布时间: 2016-02-21 16:16:19

标签: Java的程序Java的违例Java编程

大神带你学编程,欢迎选课

  读者或许会奇怪为什么需要一个对象从它的序列化状态中恢复。举个例子来说,假定我们序列化一个对象,并通过网络将其作为文件传送给另一台机器。此时,位于另一台机器的程序可以只用文件目录来重新构造这个对象吗?

Java程序中可以只用文件目录来重新构造对象吗?_Java的程序_Java的违例_课课家

  回答这个问题的最好方法就是做一个实验。下面这个文件位于本章的子目录下:

  //: Alien.java

  // A serializable class

  import java.io.*;

  public class Alien implements Serializable {

  } ///:~

  用于创建和序列化一个Alien对象的文件位于相同的目录下:

  //: FreezeAlien.java

  // Create a serialized output file

  import java.io.*;

  public class FreezeAlien {

  public static void main(String[] args)

  throws Exception {

  ObjectOutput out =

  new ObjectOutputStream(

  new FileOutputStream("file.x"));

  Alien zorcon = new Alien();

  out.writeObject(zorcon);

  }

  } ///:~

  该程序并不是捕获和控制违例,而是将违例简单、直接地传递到main()外部,这样便能在命令行报告它们。

  程序编译并运行后,将结果产生的file.x复制到名为xfiles的子目录,代码如下:

  //: ThawAlien.java

  // Try to recover a serialized file without the

  // class of object that's stored in that file.

  package c10.xfiles;

  import java.io.*;

  public class ThawAlien {

  public static void main(String[] args)

  throws Exception {

  ObjectInputStream in =

  new ObjectInputStream(

  new FileInputStream("file.x"));

  Object mystery = in.reADObject();

  System.out.println(

  mystery.getClass().toString());

  }

  } ///:~

  该程序能打开文件,并成功读取mystery对象中的内容。然而,一旦尝试查找与对象有关的任何资料——这要求Alien的Class对象——Java虚拟机(JVM)便找不到Alien.class(除非它正好在类路径内,而本例理应相反)。这样就会得到一个名叫ClassNotFoundException的违例(同样地,若非能够校验Alien存在的证据,否则它等于消失)。

  恢复了一个序列化的对象后,如果想对其做更多的事情,必须保证JVM能在本地类路径或者因特网的其他什么地方找到相关的.class文件。

赞(26)
踩(1)
分享到:
华为认证网络工程师 HCIE直播课视频教程