/**
 * Cities class contains the main method to run the program. It uses a directed
 * graph to store the names of and distances between cities.
 */
import java.io.*;
import java.io.InputStreamReader;
import java.util.*;
public class Cities  implements Serializable
    {
   public static void main(String[] args) {
    CityGraph graph=new CityGraph();
    try {
      FileInputStream file = new FileInputStream("graph.obj");
      ObjectInputStream inStream = new ObjectInputStream(file);
      graph = (CityGraph) (inStream.readObject());
     }
    catch (FileNotFoundException e) {
    }
    catch (Exception e) { e.printStackTrace(); }    char choice = 'q';
    try {
      InputStreamReader instream = new InputStreamReader(System.in);
     BufferedReader stdin = new BufferedReader(instream);
      do {
        System.out.println("\nPlease choose from following options");
        System.out.println("I.   Insert a new city");
        System.out.println("P.   Add a new path");
        System.out.println("L.   List all paths leaving a city");
        System.out.println("E.   Check if direct path exists");
        System.out.println("F.   Find the shortest path");
        System.out.println("Q.   Quit the program");
        System.out.print("\nOption: ");
        choice = stdin.readLine().trim().charAt(0);
        if (choice == 'i' || choice == 'I') {
          try {
            graph.insert();
          }
          catch (error e) {
            System.out.println(e.getMessage());
          }
        }
        else if (choice == 'p' || choice == 'P') {
          try {
            graph.addPath();
          }
          catch (error e) {
            System.out.println(e.getMessage());
          }
        }
        else if (choice == 'l' || choice == 'L') {
          try {
            graph.pathFromCity();
          }
          catch (error e) {
            System.out.println(e.getMessage());
          }
        }        else if (choice == 'e' || choice == 'E') {
          try {
            graph.ifPathExist();
          }
          catch (error e) {
            System.out.println(e.getMessage());
          }
        }
        else if(choice=='f' || choice=='F')
        {graph.FindShorest();        }        else if (choice == 'q' || choice == 'Q') {
          try {
            FileOutputStream out = new FileOutputStream("graph.obj");
            ObjectOutputStream outStream = new ObjectOutputStream(out);
            outStream.writeObject(graph);
            outStream.flush();
            System.out.println("graph object saved as graph.obj.");
          }
         catch (Exception e) {
           e.printStackTrace();
         }
          System.out.println("Thank you for using the program. Good-Bye.");
        }
        else {
          System.out.println("Invalid choice. Try again.");
        }
      }
      while (choice != 'q' && choice != 'Q');
    }
    catch (Exception e) {
      e.printStackTrace();
   }  }}--------------------------------------------------------------------------------
 /**self-defined exception class to handle exception
 */
import java.util.*;
import java.io.*;
public class error extends Exception implements Serializable {
  public error() {
    super("Error: The graph is full.");  }
  public error(String s)
  {super(s);
  }
}
 
 
请问为什么program一调用readOjbect() 和 writeObject(---)就有问题
我的每个class已经都implements Serializable了
它还说
 java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.io.InputStreamReader
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1278)
        at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
        at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
        at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
        at Cities.main(Cities.java:15)
Caused by: java.io.NotSerializableException: java.io.InputStreamReader
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
        at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1332)
        at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1304)
        at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1247)
        at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
        at Cities.main(Cities.java:77)
高手帮帮忙,,谢谢~~~code有点长,谢了

解决方案 »

  1.   

    你的代码有点长,java.io.NotSerializableException 报的是没有序列化,你再好好检查一下写入的数据吧。写序列化数据
    try
        {
          FileOutputStream fout = new FileOutputStream(fileName);
          ObjectOutputStream oout=new ObjectOutputStream(fout);
          oout.writeObject(list);
          fout.close();
        }
        catch(Exception e)
        {
          e.printStackTrace();
        }
    读序列化数据try
        {
          FileInputStream fin=new FileInputStream(fileName);
          ObjectInputStream oin=new ObjectInputStream(fin);
          Object obj=oin.readObject();
          link=(LinkedList)obj;
        }
        catch(Exception e)
        {
          e.printStackTrace();
        }
      

  2.   

    还不可以,
    java.io.NotSerializableException: java.io.InputStreamReader
            at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
            at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1332)
            at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1304)
            at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1247)
            at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
            at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
            at Cities.main(Cities.java:77)
    到底问题在哪里???
      

  3.   

    找到问题了
    把CityGraph class 中的
      InputStreamReader instream = new InputStreamReader(System.in);
      BufferedReader stdin = new BufferedReader(instream);
    改为
      private static InputStreamReader instream = new InputStreamReader(System.in);
      private static BufferedReader stdin = new BufferedReader(instream);具体为什么,我也不清楚。。可能因为static InputStreamReader,BufferedReader就不用save他们的reference吧