Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java序列化:';ClassNotFoundException';反序列化对象时_Java_Oop_Serialization_Deserialization - Fatal编程技术网

Java序列化:';ClassNotFoundException';反序列化对象时

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

错误:

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”之外,还包含所有必需的代码

在类中保存和加载对象:

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"); }}