序列化对象Java的问题

时间:2011-09-06 22:44:26

标签: java android serialization

我有一个tablelayout实现了可以保存tablerows的serializable。在tablerows中,它将包含一个edittext和一个复选框,就像确切的清单一样。

然而,当我尝试序列化tablelayout(CheckList)时,它会告诉我tablerows不可定制。我之后实现了它也可以序列化。但它告诉我,EditText和CheckBox不可序列化。

我该如何解决这个问题?

更新:(Serializer.java)

public class Serializer {

public static byte[] serializeObject(Object o) { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

    try { 
      ObjectOutput out = new ObjectOutputStream(bos); 
      out.writeObject(o); 
      out.close(); 

      // Get the bytes of the serialized object 
      byte[] buf = bos.toByteArray(); 

      return buf; 
    } catch(IOException ioe) { 
      Log.e("serializeObject", "error", ioe); 

      return null; 
    } 
}

  public static Object deserializeObject(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; 
    } 
  } 
}

这是我序列化清单的方式:

        Intent intent = new Intent();
        Bundle bundle = new Bundle();
        bundle.putSerializable("checklist", Serializer.serializeObject(checklist));
        intent.putExtra("checklist", bundle);
        setResult(Activity.RESULT_OK, intent);
        finish();

以下是我尝试反序列化的方法:

    try {
                Bundle extras = data.getExtras();
                Bundle checklist_bundle = extras.getBundle("checklist");
                byte[] bytes =  (byte[]) checklist_bundle.getSerializable("checklist");
                CheckList checklist = (CheckList) Serializer.deserializeObject(bytes);

            } catch (Exception e) {
                e.printStackTrace();
            }

4 个答案:

答案 0 :(得分:1)

我会扩展类,使扩展类可序列化,然后使用它。

不确定我还能添加什么来使其更具实质性,但我想我们可以随着时间的推移在它上面建立? :)

答案 1 :(得分:1)

尝试将这些字段标记为transients or implement Externalizable

此致  斯蒂芬

答案 2 :(得分:0)

告诫我根本没有做任何Android编程,但我确实检查了Android的Bundle接口定义。

http://developer.android.com/reference/android/os/Bundle.html#putSerializable%28java.lang.String,%20java.io.Serializable%29

你好像在说错话。先关闭:

  • 无需创建自己的序列化/反序列化方法,抛弃那些,让JVM序列化引擎完成工作

  • bundle.putSerializable("checklist", Serializer.serializeObject(checklist)); 应该只是 bundle.putSerializable("checklist", checklist); 确保CheckList实现Serializable

  • byte[] bytes = (byte[]) checklist_bundle.getSerializable("checklist")应该是 CheckList ck = (CheckList) checklist_bundle.getSerializable("checklist")

  • 上面提到你有来自CheckList的“App”的引用?我不确定“App”是什么,但如果它是不可序列化的,则将“瞬态”修饰符打到CheckList类中的成员变量定义。请注意,在反序列化期间,您必须正确地“填充”该字段。反序列化器不会自动为您执行此操作(这是Externalizable可以进入的地方)

答案 3 :(得分:0)

那么在Android中使用Parcelable界面呢?