2011-09-06 49 views
0

問題我有一個實現Serializable這使tablerows一個tablelayout。在表格中,它將包含一個edittext和一個複選框,非常類似於清單。與序列化對象的Java

然而,當我嘗試序列化tablelayout(表)它告訴我的是,tablerows不serizable。之後我也實現了它可序列化。但是,它告訴我EditText和CheckBox是不可序列化的。

我該如何解決這個問題?

UPDATE:(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(); 
      } 

回答

1

我將擴展類,使擴展類可序列化,並使用它。

不知道還有什麼我可以補充,使這個更充實,但我想我們可以隨着時間的推移它建? :)

+0

感謝您的回覆。檢查表擴展了我創建的項目類,而項目類擴展了一個視圖類,你知道我該如何擴展它嗎? –

+0

我還添加了一些代碼,以便如何序列化和反序列化CheckList。希望它會更清晰。 –

+0

你不需要改變任何東西:只要確保所有的類都實現了Serializable'。您不需要創建讀取和寫入方法,除非它以默認方式不適用於您。 (老實說,我從來沒有默認的方法失敗!) – corsiKa

1

嘗試,以紀念那些領域transients or implement Externalizable

問候, 斯特凡

+0

感謝您的回覆。我試圖改變我的清單對象來實現Externalizable,但是當我嘗試bundle.getSerializable(「清單」),我想如何反序列化這個對象,以便最終的對象將是一個CheckList對象? –

+0

我已經在問題中添加了我的序列化程序類。 –

+0

我還添加了一些代碼,以便如何序列化和反序列化CheckList。希望它會更清晰。 –

0

告誡說,我沒有做過任何Android編程可言,但我沒有檢查的Android包接口定義。

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); 確保覈對表實現Serializable

  • byte[] bytes = (byte[]) checklist_bundle.getSerializable("checklist")應該 CheckList ck = (CheckList) checklist_bundle.getSerializable("checklist")

  • 有上面提到的,你必須從清單中的「應用程序」的參考?我不確定什麼是「App」,但是如果它是不可序列化的,則在CheckList類中爲其成員變量定義添加一個「transient」修飾符。不過,請注意反序列化過程中,你必須正確地「補」的田野,解串器不會爲你做自動(這是外部化可以進來)使用Parcelable接口

0

又是怎麼回事在Android?