2011-09-06 6 views
0

tablayow를 유지하는 serializable을 구현하는 tablelayout이 있습니다. tablerows에는 edittext와 checkbox가 포함될 것입니다. 정확한 체크리스트와 같습니다.개체 직렬화 문제 Java

그러나 tablelayout (CheckList)을 직렬화하면 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

I을 클래스를 확장하고, 확장 클래스를 직렬화 가능하게 만들고 대신 사용할 수 있습니다.

내가 더 많이 만들 수 있도록 추가 할 수있는 것이 있는지 모르겠지만 시간이 지남에 따라이를 만들 수 있다고 생각하십니까? :)

+0

답장을 보내 주셔서 감사합니다. 검사 목록은 내가 만든 무언가의 항목 클래스를 확장하고 항목 클래스는보기 클래스를 확장합니다. 어떻게 확장 할 수 있습니까? –

+0

또한 CheckList를 serialize하고 deserialize하는 방법에 대한 코드를 추가했습니다. 그것이 더 명확 해 지길 바랍니다. –

+0

아무 것도 변경할 필요가 없습니다. 모든 클래스가''Serializable'을 구현하는지 확인하십시오. 기본 방법으로 작동하지 않는 한 읽기 및 쓰기 메소드를 작성할 필요가 없습니다. (필자는 기본 방법으로 절대로 실패하지 않았지만 정직하게도!) – corsiKa

1

해당 필드를 transients or implement Externalizable으로 표시하려고합니다.

감사합니다, 나는 전혀 안드로이드 프로그래밍을하지 않은,하지만 Android 용 번들 인터페이스 정의를 확인했다 스테판

+0

나는 Externalizable을 구현하기 위해 체크리스트 객체를 변경하려고했지만 bundle.getSerializable ("checklist")을 시도했을 때 최종 객체가 CheckList 객체가되도록이 객체를 deserialize 할 수 있습니까? –

+0

질문에 serializer 클래스를 추가했습니다. –

+0

또한 CheckList를 serialize하고 deserialize하는 방법에 대한 코드를 추가했습니다. 그것이 더 명확 해 지길 바랍니다. –

0

주의.

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

당신은 잘못된 물건을 호출 할 것으로 보인다. 첫째 :

  • 그 도랑, 자신의 직렬화/역 직렬화하는 방법을 만들 필요가 없습니다, 확인 체크리스트 Serializable를 구현

    bundle.putSerializable("checklist", Serializer.serializeObject(checklist)); 단지 bundle.putSerializable("checklist", checklist); 만들되어야 JVM 직렬화 엔진이 작업

  • 을하자

  • byte[] bytes = (byte[]) checklist_bundle.getSerializable("checklist")해야 CheckList ck = (CheckList) checklist_bundle.getSerializable("checklist")

  • CheckList의 "App"에 대한 참조가 있다는 언급이 있습니까? "App"이 무엇인지는 확실치 않지만, 비 직렬화 인 경우 CheckList 클래스의 멤버 변수 정의에 "임시"수정자를 사용하십시오. 직렬화 복원시에, 제대로에 해당 필드를 "입력"을 가질 수 있지만합니다. 디시리얼라이저는 자동으로 당신을 위해 그렇게 할 것입니다 Parcelable 인터페이스를 사용하여

0

그리고 무엇인지를 (외부화가 올 수있는 곳이있다) Android에서?