当前位置: 首页 > 知识库问答 >
问题:

Java序列化:反序列化对象时的“ClassNotFoundException”

公良云
2023-03-14

错误:

java.lang.ClassNotFoundException:testprocedure.tp$3在java.net.URLClassLoader$1上运行(未知源)在java.net.URLClassLoader上运行(未知源)在java.security.accessController.doprivileged(本机方法)在java.net.URLClassLoader.findClass(未知源)在java.lang.ClassLoader.LoadClass(未知源)在sun.misc.launcher上运行(未知源)在java.lang.ClassLoader.LoadClass(未知源)e)在java.io.ObjectInputStream.ReadObject0(未知源)在java.io.ObjectInputStream.ReadObject(未知源)在Core.ProceduResetup.Load(ProceduResetup.java:57)在Core.Engine.Main(Engine.java:25)

我实例化了该对象,并从类“TP”中调用“ProceduResetUp”的“Save”方法

ProcedureSetup ps=new ProcedureSetup(new Procedure(){ public void doStuff(){ System.out.println("Stuff is being done"); }});
ps.save();

然而,我从不同的程序集合加载,这些程序包含所有必需的代码,但不包含“tp”。

ProcedureSetup ps=new ProcedureSetup();
ps.load();

类内的对象保存和加载:

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”,那么我该如何去做呢?(链接会很可爱)

共有2个答案

嵇浩然
2023-03-14

当你读入一个序列化的对象时,Java通过使用序列化流中的信息来“重建”它,构建对象的活副本。除非它具有对象的类的.class文件,否则它不能这样做;它需要一个空白副本来“填写”来自流的信息。

最好的选择通常是确保类在类路径上。如果你有一些特殊的原因为什么这不起作用,Java连载不适合你;JSON可能是一个合适的选择。

方风华
2023-03-14
new Procedure(){ public void doStuff(){ System.out.println("Stuff is being done"); }}

上面是TP类的匿名内部类。因此,要反序列化,这个匿名内部类及其封闭类TP必须存在于类路径中:字节流包含类的名称和对象的字段,但不包含类本身的字节代码。

您应该使它成为一个顶级类,或者至少是一个静态的内部类。

你也应该尊重Java的命名惯例:类是camelcased。

 类似资料:
  • 本文向大家介绍java对象的序列化和反序列化,包括了java对象的序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java对象的序列化和反序列化,供大家参考,具体内容如下 1. 什么是序列化        将对象转换为字节流保存起来,比如保存到文件里,并在以后还原这个对象,这种机制叫做对象序列化。(补充一句:把对象保存到永久存储设备上称为持久化) 2. 怎么实现序列化

  • 上下文:我们使用Activiti作为流程引擎,使用Activiti-Rest作为应用程序的接口。由于这个问题与返回由Java序列化的对象的REST服务有关,所以我没有将其添加到标题中。 场景:我们有一个JBoss Wildfly实例,它包含一个EAR和一个包含类“ProcessContext”的模块(为了参考,我们将其称为X)。Activiti在这个EAR中运行,ServiceTasks(从进程中

  • 本文向大家介绍详解Java 对象序列化和反序列化,包括了详解Java 对象序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反。在我们看来这种行为实在是繁琐,尤其是在这个对象中属性值很多的时候。基于此,Java中对象的序列

  • 本文向大家介绍Java中对象序列化与反序列化详解,包括了Java中对象序列化与反序列化详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java中对象序列化与反序列化。分享给大家供大家参考。具体如下: 一、简介 对象序列化(Serializable)是指将对象转换为字节序列的过程,而反序列化则是根据字节序列恢复对象的过程。 序列化一般用于以下场景: 1.永久性保存对象,保存对象的字节序列

  • 我已经开始将一个项目从使用Java标准日期迁移到Joda DateTime。 我的项目使用XML序列化将对象保存到XML文件中。在这个特殊的例子中,我有一个Item类,它有一个DateTime属性。 在某个时候,我正在初始化对象,包括像这样的DateTime属性: 我使用XMLEncoder使用辅助类序列化项目: 显然,日期时间被保存在xml中。。。但毫无价值: 显然,它没有保存任何东西,但不,它