2011-11-22 107 views
5

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

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

看看Android Parcelables,它可能是你真正想使用的。 – blindstuff

+0

在回答/评论如下,调用'Button(null)'按预期工作:没有异常并在'res'中获得正确的值。必须是环境... –

+0

你如何测试?你使用amulator吗,你部署到一个实际的设备?你使用的是什么版本的模拟器/ Android?不同的Android化身(如Cyanogen和Stock Android等)之间存在差异。 –

回答

6

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

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

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

+0

+1这是一个很好的观点,有多个Serializable接口。 –

+0

它看起来sunw.io.Serializable延伸java.io.Serializable,所以我编辑该点 – Bozho

+0

它的工作原理(以及任一Serializables)。 –

7

那么,你的可序列化的对象是否有对其他不可序列化对象的任何引用?如果是这样,java.io.NotSerializableException将因此而抛出。为了能够序列化,您必须让您的类实现Serializable以及它的类型为Serializable(即实现Serializable)的所有依赖项。

异常消息应该告诉你,如果这样的非序列化的依赖存在:

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

更新:按Bozho的评论,我没有注意事实上,你的类没有任何不可序列化的依赖关系。

+0

他只浮在那里 – Bozho

+0

是的,我的坏,我没有一直滚动到底部,没有看到“ser”类也在那里。我会更新我的答案以反映这一点。 –

+0

还有另一种序列化类的方法吗? 我想要做的就是用蓝牙发送这样的类,它只允许字节数组... – user1059863

0

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

解决方案,请确保您的类ser不是嵌套类。如果您的类嵌套在未实现的序列化的父类中,那么内置的Java序列化将失败而没有错误。

因此,将ser类实现移至它自己的文件ser.java,现在序列化应该可以工作。

0

我打破了这个念头。 问题我的代码曾经是我在写新对象之前没有删除我的.ser文件。我的目的是编写(序列化)位置ArrayList并反序列化它们。当我获得新的位置时,我会这样做。由于我无法追加我选择写入完整列表的对象,因此我必须在每次写入新列表之前删除.ser文件。它显示的错误并未指向实际问题。 在你写东西之前,让你的-ser清新干净。

0

我知道我有点晚了,但我注意到你没有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; 
} 

再一次,我有点晚,但这个问题有成千上万的意见,你有没有捡到一个答案,所以也许这将帮助别人。

相关问题