Java序列化:';ClassNotFoundException';反序列化对象时
错误: java.lang.ClassNotFoundException:testprocedure.tp$3 位于java.net.URLClassLoader$1.run(未知源) 位于java.net.URLClassLoader$1.run(未知源) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.net.URLClassLoader.findClass(未知源) 位于java.lang.ClassLoader.loadClass(未知源) 位于sun.misc.Launcher$AppClassLoader.loadClass(未知源) 位于java.lang.ClassLoader.loadClass(未知源) 位于java.lang.Class.forName0(本机方法) 位于java.lang.Class.forName(未知源) 位于java.io.ObjectInputStream.resolveClass(未知源) 位于java.io.ObjectInputStream.readNonProxyDesc(未知源) 位于java.io.ObjectInputStream.readClassDesc(未知源) 位于java.io.ObjectInputStream.ReadOrderinaryObject(未知源) 位于java.io.ObjectInputStream.readObject0(未知源) 位于java.io.ObjectInputStream.defaultReadFields(未知源) 位于java.io.ObjectInputStream.readSerialData(未知源) 位于java.io.ObjectInputStream.ReadOrderinaryObject(未知源) 位于java.io.ObjectInputStream.readObject0(未知源) 位于java.io.ObjectInputStream.readObject(未知源) 加载(ProcedureSetup.java:57) 位于core.Engine.main(Engine.java:25) 我实例化该对象并从类“tp”调用“ProcedureSetup”的“save”方法 但是,我从一个不同的程序集合中加载,该程序除了“tp”之外,还包含所有必需的代码 在类中保存和加载对象:Java序列化:';ClassNotFoundException';反序列化对象时,java,oop,serialization,deserialization,Java,Oop,Serialization,Deserialization,错误: java.lang.ClassNotFoundException:testprocedure.tp$3 位于java.net.URLClassLoader$1.run(未知源) 位于java.net.URLClassLoader$1.run(未知源) 位于java.security.AccessController.doPrivileged(本机方法) 位于java.net.URLClassLoader.findClass(未知源) 位于java.lang.ClassLoader.loa
public void load(){
String path=Operator.persistentGetFile();//gets the file path
ObjectInputStream ois=null;
FileInputStream fin=null;
ProcedureSetup temp=null;
try {
fin = new FileInputStream(path);
ois = new ObjectInputStream(fin);
temp=(ProcedureSetup) ois.readObject();
ois.close();
fin.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if(ois!=null){
try {
ois.close();
} catch (IOException e) {}
}
if(fin!=null){
try {
fin.close();
} catch (IOException e) {}
}
if(temp!=null){
a=temp.a;
}else{
load();//If a load is failed, restart process.
}
}
public void save(){
String path=Operator.persistentGetDirectory();//get directory to save to
String input = JOptionPane.showInputDialog(this, "Enter the File name:");
ObjectOutputStream oos=null;
FileOutputStream fon=null;
try {
fon = new FileOutputStream(path+input+".obj");
oos = new ObjectOutputStream(fon);
try {
oos.writeObject(this);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
oos.close();
fon.close();
} catch (IOException e) {
e.printStackTrace();
}
if(oos!=null){
try {
oos.close();
} catch (IOException e) {}
}
if(fon!=null){
try {
fon.close();
} catch (IOException e) {}
}
}
我的问题是:
为什么会发生这些错误
为什么(如果必要的话)我的类路径中需要有“tp”
如果事实上有一种方法可以在不需要类路径中的“tp”的情况下将对象保存在当前状态,那么我该怎么做呢?(链接会很可爱)
为什么会发生这些错误
这里只有一个错误:java.lang.ClassNotFoundException:testprocedure.tp$3
。这意味着您没有向对等方部署testprocedure/tp$3.class
为什么(如果必要的话)我的类路径中需要有“tp”
这样反序列化就可以成功。您不能对没有.class文件的类执行任何操作,更不用说反序列化它的实例了
为什么会发生这些错误
这里只有一个错误:java.lang.ClassNotFoundException:testprocedure.tp$3
。这意味着您没有向对等方部署testprocedure/tp$3.class
为什么(如果必要的话)我的类路径中需要有“tp”
这样反序列化就可以成功。您无法对没有.class文件的类执行任何操作,更不用说反序列化它的实例了。当您读入序列化对象时,Java通过使用序列化流中的信息来构建对象的实时副本来“重建”它。它不能这样做,除非它有对象类的
.class
文件;它需要一个空白副本来“填写”流中的信息
最好的选择通常是确保类位于类路径上。如果您有一些特定的原因说明这不起作用,那么Java序列化不适合您;JSON可能是一个合适的选项。当您读入序列化对象时,Java通过使用序列化流中的信息来构建对象的实时副本来“重建”它。它不能这样做,除非它有对象类的
.class
文件;它需要一个空白副本来“填写”流中的信息
new Procedure(){ public void doStuff(){ System.out.println("Stuff is being done"); }}
最好的选择通常是确保类位于类路径上。如果您有一些特定的原因说明这不起作用,那么Java序列化不适合您;JSON可能是一个合适的选项
new Procedure(){ public void doStuff(){ System.out.println("Stuff is being done"); }}
上面是tp
类的匿名内部类。因此,要进行反序列化,这个匿名内部类及其封闭类必须存在于类路径中:字节流包含类的名称和对象的字段,但不包含类本身的字节码
您应该使它成为一个顶级类,或者至少是一个静态的内部类
您还应该遵守Java命名约定:类是CamelCased的
上面是tp
类的匿名内部类。因此,要进行反序列化,这个匿名内部类及其封闭类必须存在于类路径中:字节流包含类的名称和对象的字段,但不包含类本身的字节码
您应该使它成为一个顶级类,或者至少是一个静态的内部类
您还应该遵守Java命名约定:类是CamelCased的
new Procedure(){ public void doStuff(){ System.out.println("Stuff is being done"); }}