2013-10-06 3 views
2

이것은 내 문제에 대한 해결책을 찾기위한 첫 번째 시도이므로 친절한 사람이 되려고 노력합니다! 나는이 사이트에서 간단한 검색을 수행하여 문제를 해결할 수있는 수많은 솔루션을 찾았지만 이번에는 운이 없다고 생각합니다. 나는 내 문제를 해결할만한 것을 찾지 못해 새로운 질문을 물었다.직렬화 가능한 객체를 통해 전달

한 활동에서 다른 활동으로 의도를 통해 개체를 전달하려고합니다. 나는 다음과 같이 하나의 추상 클래스와 두 개의 하위 클래스 (그 중 하나는 추상 클래스)를가집니다. 나는 그들이 추상적이어야한다. 문제가 무엇인지 알아 내기 위해 많은 코드 (추상적 인 메소드 등)를 제거했고 이러한 간단한 클래스로 끝나기는했지만 여전히 동일한 문제가 있습니다.

public abstract class MyObject { 

    private boolean New; 
    private boolean Modified; 

    public MyObject() { 
     New = true; 
    } 

    public boolean isNew() { 
     return New; 
    } 

    protected void setNew(boolean value) { 
     New = value; 
    } 

    protected boolean isModified() { 
     return Modified; 
    } 

    protected void setModified(boolean value) { 
     Modified = value; 
    } 

} 

public abstract class MyItemBase extends MyObject { 

    private Long Id; 
    private String Description; 

    public MyItemBase() { 
     super(); 
    } 

    public Long getId() { 
     return Id; 
    } 

    public void setId(Long id) { 
     Id = id; 
    } 

    public String getDescription() { 
     return Description; 
    } 

    public void setDescription(String description) { 
     Description = description; 
    } 

} 

public class MyItem extends MyItemBase implements Serializable { 

    private static final long serialVersionUID = -2875901021692711701L; 

    public MyItem() { 
     super(); 
    } 

} 

ActivityB를 호출하는 ActivityB에는 ActivityB를 호출하는 두 개의 ActivityA가 있습니다. 나는 전혀 오류없이, 두 번째 활동에서 MyItem를받을 때

public class ActivityA extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_a); 

     Button btn = (Button) findViewById(R.id.button); 
     btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent intent = new Intent(getApplicationContext(), 
         ActivityB.class); 

       MyItem item = new MyItem(); 
       item.setId((long) 1); 
       item.setDescription("test"); 

       intent.putExtra("MyItem", (Serializable) item); 
       startActivityForResult(intent, 1); 
      } 

     }); 
    } 

} 

public class ActivityB extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_b); 

     MyItem item = (MyItem) getIntent().getSerializableExtra("MyItem"); 
     ((TextView) findViewById(R.id.text)).setText(item.getDescription()); 
    } 

} 

그래서, 두 속성 아이디 및 설명은 null입니다. 실제로 New 속성이 true이므로 새 객체입니다. 이제 내가 정확하게 첫 번째 활동의 의도에 넣은 후 객체를 얻으려고하면

intent.putExtra("MyItem", (Serializable) item); 
MyItem newItem = (MyItem) intent.getSerializableExtra("MyItem"); 
startActivityForResult(intent, 1); 

잘 작동합니다. newItem에는 올바른 값을 가진 모든 속성이 있습니다.

아이디어가 있으십니까?

고맙습니다. the official Serializable doc에서

+1

'Serializable '으로 전달하고자하는'Object'는'Serializable' 인터페이스를 구현해야합니다. – Sajmon

답변

1

: 자신의 상태의 직렬화 또는 직렬화 복원이되지 않습니다,이 인터페이스를 구현하지 않는

클래스. 직렬화 가능 클래스의 모든 아류 형 자체는 직렬화 가능합니다.

기본 클래스는 Serializable을 구현하지 않으므로 해당 필드가 직렬화되지 않습니다.

MyItemBase (또는 MyObject) Serializable를 확인하고 모든 하위 또한 Serializable (명시 적으로 인터페이스를 구현하지 않고)이 될 것입니다.

+0

그게 ... 나는 "최종"하위 클래스에서만 Serializable을 구현해야한다고 생각했다. MyObject 또는 MyItemBase에 Serializable을 구현하면 문제가되지 않지만 제대로 작동합니다. 실제로 MyItem에서 Serializable을 제거했지만 여전히 잘 작동합니다. 나는 그 뒤에 논리를 얻지 못한다. 어쨌든 나는 Activity B를 호출하기 전에 의도를 물어봤을 때 그것이 작동하는 이유가 아직도 혼란 스럽습니다. 물론 대답을 받아들입니다. 고마워요! – pavlospap

+0

1) 글쎄, 논리는 사양에 있습니다. 객체를 직렬화하면 먼저 객체 클래스의 필드를 직렬화합니다. 그런 다음 부모 체인을 위로 이동하고 Serializable을 구현하는 한 해당 필드를 직렬화합니다. 이를 통해 기본 클래스에서 Serializable을 구현하는 것만으로도 직렬화에 큰 영향을주지 않으면 서 대규모 기본 클래스를 가질 수 있습니다. 그게 좋은 생각인지 아닌지는 별도의 토론입니다. 2) 개체가 아직 serialize되지 않았기 때문에 Activity B를 호출하기 전에 작동합니다. Parcel이 쓰여질 때만 (startActivity 내에서) 수행됩니다. – Delyan

+0

P. 직렬화는 Android에서 느리게 진행됩니다 (모든 반향이 진행되기 때문에). 그래서 안드로이드 팀이 Parcelable (매우 빠름)을 만들었습니다. 직렬화가 병목임을 발견하면이를 염두에 두십시오. – Delyan

관련 문제