我有一个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();
}
答案 0 :(得分:1)
我会扩展类,使扩展类可序列化,然后使用它。
不确定我还能添加什么来使其更具实质性,但我想我们可以随着时间的推移在它上面建立? :)
答案 1 :(得分:1)
尝试将这些字段标记为transients or implement Externalizable。
此致 斯蒂芬
答案 2 :(得分:0)
告诫我根本没有做任何Android编程,但我确实检查了Android的Bundle接口定义。
你好像在说错话。先关闭:
无需创建自己的序列化/反序列化方法,抛弃那些,让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界面呢?