Похоже, что я не понимаю какой-то фундаментальный принцип 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)
Я скомпилировал ваш код (сменив Stop на String), и он работает:/stopsDataMap.put («A», «B»); stopsDataMap.serialize(); System.out.println (stopsDataMap.getMap(). ToString()); result> Hello {A = B} – slipperyseal
Я не уверен, что произошло, но я раскоментил код «serialize()» и перезапустил программу. и он отлично работает. Я предполагаю, что мой старый сериализованный файл создал поврежденный файл? – mastrgamr
см. Мой ответ, вы воссоздали файл и исправили имя пакета :) – slipperyseal