프레임워크

[해결] Parcelable encountered IOException writing serializable object

khao 2018. 1. 14. 12:59

안드로이드에서는 객체를 Intent에서 넘기기 위해서는 implements Serializable을 해당 객체에게 추가해주면 된다.

 

CharacterItem 이라는 객체를 리스트뷰에서 눌렀을 때 객체 속 String이나 int같은 값을 따로따로 전달하지 않는 방법.

 

Character implements Serializable { private String name; private int level; private int job; // job is job code (1=warrior, 2=archor . . .)   public String getName() { return name; } public void setName(String name) { this.name = name; } public int getLevel() { return level; } public void setLevel(int level) { this.level = level; } public int getJob() { return job; } public void setJob(int job) { this.job = job; } }

이런 식으로 Serializable을 적용해준 다음에

 

Intent intent = new Intent(getApplicationContext(), MainActivity.class);
Character character = (Character) characterAdapter.getItem(i);
intent.putExtra("character", character);

이런 방식으로 전달해주면 된다. (참고로 변수 i는 리스트뷰의 n번째 위치를 의미하고 Adapter는 리스트뷰에 붙인 어댑터를 의미한다)

 

 

 

만약 이런 식으로 Serializable을 적용했는데도 오류가 발생한다면, 객체 안에 또 다른 객체가 있을 경우에는 해당 객체에게도 Serializable을 적용해야 한다.

 

Character implements Serializable {
  private String name;
  private int level;
  private int job; // job is job code (1=warrior, 2=archor . . .)
  private List<BagItem> bag;
 
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getLevel() {
    return level;
  }
  public void setLevel(int level) {
    this.level = level;
  }
  public int getJob() {
    return job;
  }
  public void setJob(int job) {
    this.job = job;
  }
}

이런 식으로 BagItem이라는 클래스를 하나 만들었다고 한다면, Character를 Intent로 넘기기 위해서는 BagItem도 implements Serializable 해줘야 한다.