java.io.NotSerializableException即使我实现“Serializable”

时间:2011-11-22 13:30:28

标签: java android exception serialization

我有一点问题: 我想测试android上的序列化(使用eclipse),并找到了一个如何做的例子。 我知道我需要在我要序列化的类中实现“Serializable”,我已经这样做并且总是得到一个java.io.NotSerializableException异常。这是代码:

public void Button(View view) throws IOException, ClassNotFoundException {
ser test = new ser();
    test.x = 204;
    test.y = 2843;
    test.speed = 12;
    test.direction = 1343;
    test.a = 493;
    test.b = 2323;
    test.c = 29489;
    test.d = 394;

    byte[] arr = serialize(test);

    ser res = (ser) deserialize(arr);
}


public static byte[] serialize(Object o) { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream();  
    try {   
        ObjectOutput out = new ObjectOutputStream(bos);      
        out.writeObject(o);                                       //This is where the Exception occurs
        out.close();     
        // Get the bytes of the serialized object    
        byte[] buf = bos.toByteArray();   
        return buf;    
    } catch(IOException ioe) { 
        Log.e("serializeObject", "error", ioe);           //"ioe" says java.io.NotSerializableException exception
        return null; 
    }  

}


public static Object deserialize(byte[] b) {  
        try {    
            ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(b));    
            Object object = in.readObject();    
            in.close();  
            return object;  
        } catch(ClassNotFoundException cnfe) {   
            Log.e("deserializeObject", "class not found error", cnfe);   
            return null;  
        } catch(IOException ioe) {  
            Log.e("deserializeObject", "io error", ioe);    
            return null; 
        } 
    } 

class ser implements Serializable {
    float x, y, speed, direction, a, b, c, d;
}

我希望你能帮助我,我不知道我做错了什么......

编辑:我的导入是:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

7 个答案:

答案 0 :(得分:8)

那么,您的可序列化对象是否对其他非可序列化对象有任何反馈?如果是这样,那么java.io.NotSerializableException将被抛出。为了能够序列化,您必须拥有类实现Serializable并且所有依赖项都必须是Serializable类型(即实现Serializable)。

异常消息应该告诉您是否存在这样的非可序列化依赖项:

应该说“java.io.NotSerializableException:NonSerializableClassName”

更新:根据Bozho的评论,我没有注意到实际上你的类没有任何不可序列化的依赖。

答案 1 :(得分:6)

我唯一能想到的就是你所运行的课程不是你写的课程 - 例如你还没有编译新的版本。

我无法用简单的java程序重现问题。

最初我认为你可能已经实现了sunw.io.Serializable而不是java.io.Serializable,但它扩展了io类,因此它应该可以正常工作。

答案 2 :(得分:4)

我从下面的链接得到了答案,尽管我无法理解整个事情。 why does this simple serializable object throw NotSerializableException? 因为你的内部类不是静态的,所以要作为序列化的东西存在,它将需要outter类的实例并且一个activity不是serializabled。使Tester成为一个单独的类或使其成为静态内部类。

答案 3 :(得分:2)

从您的代码中不清楚。但是如果你已经将“ser”定义为其他一些不可服用的类的内部类(在你的情况下可能是“Activity”,它是不可服务化的)那么要么将父类定义为可序列化的,要么不将“ser”定义为内心阶层。

Serialization of inner classes (i.e., nested classes that are not static member classes), including local and anonymous classes, is strongly discouraged for several reasons.

答案 4 :(得分:2)

旧问题,但会添加我的解决方案,因为我最近有类似的问题。

解决方案,确保您的班级ser不是嵌套类。如果您的类嵌套在未实现的序列化父类中,则内置的Java序列化将失败而不会出错。

所以将ser类实现移动到它自己的文件ser.java,序列化现在可以正常工作。

答案 5 :(得分:0)

我打破了这个问题。 发出我的代码是因为我在写新对象之前没有删除我的.ser文件。我的目的是编写(序列化)位置的ArrayList并反序列化它们。当我获得新的位置时,我会这样做。因为我无法附加我选择写入完整List的对象所以我必须在写入新List之前每次删除.ser文件。它显示的错误并未指向实际问题。 在你写东西之前,让你的新鲜和清洁。

答案 6 :(得分:-1)

我知道我有点迟了但是我注意到你没有一个serialVersionUID,类似private static final long serialVersionUID = 7536482295622776147L;在你班级的顶端,(尽管它很重要,但是它可能有帮助)尝试分离你的变量,所以:

class ser implements Serializable {
    private static final long serialVersionUID = 7536482295622776147L;
    float x;
    float y;
    float speed;
    float direction;
    float a;
    float b;
    float c;
    float d;
}

再一次,我有点迟了,但这个问题有成千上万的观点,你还没有选择答案,所以这可能对某人有帮助。