首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java - NotSerializableException

Java - NotSerializableException
EN

Stack Overflow用户
提问于 2014-02-20 21:33:37
回答 2查看 825关注 0票数 0

我现在正把头撞在墙上。

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

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

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

代码语言:javascript
复制
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();
    }
}

如果有人能找到,我这辈子都欠你的。

更奇怪的是:当我试图加载文件时,错误还提到了保存函数.尽管我评论了所有的功能。

代码语言:javascript
复制
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)

编辑:这是块类:

代码语言:javascript
复制
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以防万一:

代码语言:javascript
复制
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);
}

}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-20 21:51:15

在使vector.Block可序列化之前创建了该文件。你得重新创造它。

票数 3
EN

Stack Overflow用户

发布于 2014-02-20 21:37:03

所有应该序列化的类都必须实现Serializable-Interface。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21920082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档