2015-01-19 5 views
1

Похоже, что я не понимаю какой-то фундаментальный принцип Java, но по какой-то причине я не могу десериализовать свой класс внутри себя. Когда я запускаю это в основном классе, компилятор ловит ClassNotFoundException. Вот мой класс:Пользовательский класс, производящий ClassNotFoundException сам по себе

public class DataMaps<T> extends HashMap<String, T>{ 
private T t; 

public void serialize() { 
    try { 
     FileOutputStream fos = new FileOutputStream("stopMap.ser"); 
     ObjectOutputStream oos = new ObjectOutputStream(fos); 
     oos.writeObject(this); 
     oos.close(); 
     fos.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public HashMap getMap() { 
    //De-serialize map stored in memory 
    HashMap map = null; 
    try 
    { 
     FileInputStream fis = new FileInputStream("stopMap.ser"); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     map = (HashMap)ois.readObject(); //CLASSNOTFOUNDEXCEPTION 
     ois.close(); 
     fis.close(); 
    } catch(IOException e) { 
     e.printStackTrace(); 
    } catch(ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 

    return map; 
} 

}

public class Main { 

private Stops stop; 
private DataMaps<Stops> stopsDataMap; 
private String[] stopInfo; 

public Main() { 
    stopsDataMap = new DataMaps<Stops>(); 
    try { 
     BufferedReader br = new BufferedReader(new FileReader("stops.txt")); 
     String line = br.readLine(); 

     while((line = br.readLine()) != null){ 
      stopInfo = line.split(","); 
      stop = new Stops(stopInfo[0], stopInfo[2], stopInfo[4], stopInfo[5]); 
      stopsDataMap.put(stop.getStopId(), new Stops(stopInfo[2], stopInfo[4], stopInfo[5])); 
      System.out.println(stop); 
     } 
     //stopsDataMap.serialize(); //commented out since the file exists 

     System.out.println(stopsDataMap.getMap().toString()); //Produces the error 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public static void main(String args[]) { 
    System.out.println("Hello"); 
    new Main(); 
} 

}

В первой у меня была сериализованную карта бросание на мой созданного класса DataMaps и DataMaps<T> но те не работали, поэтому я пошел и попытался преобразовать сериализованные данные в HashMap, мой класс расширен и по-прежнему получает ошибку. Я не знаю, что происходит, если кто-то может указать здесь здесь?

Вот StackTrace:

java.lang.ClassNotFoundException: DataMaps 
at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:270) 
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:623) 
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1610) 
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1515) 
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1769) 
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1348) 
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 
at net.mastrgamr.gtfs.static_objects.DataMaps.getMap(DataMaps.java:40) 
at net.mastrgamr.gtfs.Main.<init>(Main.java:33) 
at net.mastrgamr.gtfs.Main.main(Main.java:43) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:606) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 
+1

Я скомпилировал ваш код (сменив Stop на String), и он работает:/stopsDataMap.put («A», «B»); stopsDataMap.serialize(); System.out.println (stopsDataMap.getMap(). ToString()); result> Hello {A = B} – slipperyseal

+0

Я не уверен, что произошло, но я раскоментил код «serialize()» и перезапустил программу. и он отлично работает. Я предполагаю, что мой старый сериализованный файл создал поврежденный файл? – mastrgamr

+0

см. Мой ответ, вы воссоздали файл и исправили имя пакета :) – slipperyseal

ответ

0

Я думаю, что я могу увидеть проблему из трассировки стека. Сериализация происходит в

net.mastrgamr.gtfs.static_objects.DataMaps.getMap 

Но исключение составляет

java.lang.ClassNotFoundException: DataMaps 

Если бы это было то же самое DataMaps класс он будет читать

java.lang.ClassNotFoundException: net.mastrgamr.gtfs.static_objects.DataMaps 

Вы сериализовать данные в файл, а затем добавили пакет в DataMaps, что делает их эффективно разными классами.

+1

OHHH, я так глуп! Мне потребовалось некоторое время, чтобы понять это, но, я думаю, я ввернул себя, сериализуя данные, а затем переставляя файлы в свой проект. Wow ... – mastrgamr

+0

Meh. Бывает :) – slipperyseal

Смежные вопросы