我有一点问题: 我想测试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;
答案 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”定义为内心阶层。
答案 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;
}
再一次,我有点迟了,但这个问题有成千上万的观点,你还没有选择答案,所以这可能对某人有帮助。