【问题标题】:Java - NotSerializableExceptionJava - NotSerializableException
【发布时间】:2023-04-03 08:05:01
【问题描述】:

我现在正用头撞墙。

这是交易:我创建了一个 BlockList 类,在其中创建了一个块列表。这个类是序列化的,Block 类也是(也是我在 Block 类中使用的 RGB 类)。

因此,当我尝试使用 ObjectOutputStream 将列表保存在二进制文件中时,一切正常。

但是当我尝试读取文件时,我得到了这个 NotSerializable 异常。我的意思是,我所有可能包含在列表中的类都是可序列化的。为什么我什至会收到此错误?

public void saveToHardDrive(){
    try{
        FileOutputStream fos = new FileOutputStream("blocks.bk", true);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(list);
        oos.close();
    }catch(IOException e){
        System.out.println("ERREUR : erreur lors de la sauvegarde.");
    }
}

public void loadFromHardDrive(){
    try {
        FileInputStream fis = new FileInputStream("blocks.bk");
        ObjectInputStream ois = new ObjectInputStream(fis);
        list = (ArrayList<Block>) ois.readObject();
        ois.close();
        fis.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {

        e.printStackTrace();
    }
}

如果有人能找到,我余生都欠你。

PS:更奇怪的是:当我尝试加载文件时,错误还提到了保存功能......即使我评论了所有功能。

java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: vector.Block
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at java.util.ArrayList.readObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at vector.BlockList.loadFromHardDrive(BlockList.java:60)
at vector.main.file(main.java:184)
at vector.Controls.Controls(Controls.java:57)
at vector.main.gameLoop(main.java:111)
at vector.main.main(main.java:171)

Caused by: java.io.NotSerializableException: vector.Block
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.ArrayList.writeObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at vector.BlockList.saveToHardDrive(BlockList.java:51)
at vector.main.file(main.java:189)
at vector.Controls.Controls(Controls.java:57)
at vector.main.gameLoop(main.java:113)
at vector.main.main(main.java:173)

编辑:这是 Block 类:

public class Block implements Serializable{
private float x;
private float y;
private float height;
private float length;
private RGB color;

public Block(float x, float y){
    this.x = x;
    this.y = y;
    length = 100;
    height = 100;
    color = new RGB(1, 1, 1);
}

public Block(Player p){
    setX(p.getX());
    setY(p.getY());
    setHeight(p.getHeight());
    setLength(p.getLength());
    setColor(new RGB(1, 1, 1));
}

public void render() {
    Quad.renderQuad(this);
}

还有 RGB 以防万一:

public class RGB implements Serializable{
float r, g, b;

public RGB(float R, float G, float B){
    r=R;g=G;b=B;
}
public String toString(){
    return (r*250) + ", " + (g*250) + ", " + (b*250);
}

}

【问题讨论】:

  • 你可以为你的 Block 类添加代码吗?
  • 尝试将您正在阅读的list 声明为Block[]
  • 仅注释 - 您应该在可序列化的类中使用 serialVersionUID
  • 我们能看到你的列表变量的声明吗?
  • 您离提供一个完整的、可重复的程序不远了。请提供三个类的完整代码:BlockList、Block 和 RGB,以及尝试从文件保存和加载列表的 main 方法。

标签: java exception serializable


【解决方案1】:

您在制作 vector.Block Serializable 之前创建了文件。你必须重新创建它。

【讨论】:

  • 我不确定我应该怎么做。
  • 删除.bk文件,调用saveToHardDrive(),然后再次尝试loadFromHardDrive()
  • 如果 Block 不可序列化,OP 如何创建包含序列化 List 的文件?
  • 好想,就是这样......有人可以解释发生了什么吗?
  • 这就是我想知道的 JB,但也许 EJP 知道一些我不知道他的 93k 代表的事情:P
【解决方案2】:

所有应该序列化的类,必须实现Serializable-接口。

【讨论】:

  • “我的意思是,我的所有可能包含在列表中的类都是可序列化的。为什么我什至会收到这个错误?”我相信 OP 已经解决了这个问题。
  • 没问题。容易犯错误。 OP 的术语并不能立即让人明白。
猜你喜欢
  • 2014-07-23
  • 2018-08-23
  • 2015-12-11
  • 2012-05-09
  • 2014-09-09
  • 1970-01-01
  • 2018-10-04
  • 2015-06-01
  • 2013-05-14
相关资源
最近更新 更多