안드로이드 개발 팁 #67 - 인텐트에 데이터를 읽거나 기록할 때 발생하는 BadParcelableException 예외

인텐트에 데이터를 읽거나 기록할 때 발생하는 BadParcelableException 예외

No. 67
2024. 06. 13 (목) | Written by @dorian-mobileapp

안드로이드에서 인텐트(intent)는 안드로이드의 4대 컴포넌트(액티비티, 서비스, 컨텐트 프로바이더, 브로드캐스트 리시버)들 사이에 데이터를 전달하는 수단으로 활용됩니다. 자바/코틀린 언어가 기본으로 제공하는 타입(정수형, 실수형, 문자, 문자열, 불리언, 배열 등등)의 데이터는 인텐트에 넣을 수 있습니다. 프로그래머가 클래스로 정의한 타입은요. Serializable 또는 Parcelable 인터페이스를 구현한 클래스에 한해 가능합니다.

실무에서 경험했던 이슈입니다. 액티비티 A1가 다른 액티비티 A2를 시작하기 위한 인텐트에 객체를 추가했으며, 그것의 데이터 타입은 Serializable 인터페이스를 구현했습니다. 그런데 인텐트에 데이터를 추가할 때 android.os.BadParcelableException 예외가 발생했습니다. 메시지 내용은 'Parcelable encountered IOException writing serializable object'이었죠. 그것이 발생한 코드 위치가 보이지 않아 처음에는 난감했습니다. 찾아보니 원인은 다음과 같았습니다.

원인

전달할 객체의 데이터 타입이 C1이라고 가정해 봅시다. 이 타입 안에 C2라는 또 다른 사용자 정의 데이터형으로 정의한 필드가 있었습니다. C1은 Serializable 인터페이스를 구현했지만, C2는 그렇지 않았습니다. 이 때문에 BadParcelableException 예외가 발생한 것입니다.

해결

C2 클래스에서 Serializable 인터페이스를 구현했습니다.

as-is
data class C2 (...)
to-be
data class C2(...) : Serializable

추가로...

Serializable보다는 Parcelable로 데이터 클래스를 구현하는 게 더 좋다는 의견들이 많죠. 모르는 건 아니지만, 데이터 클래스들을 정의할 도메인 모듈은 일반적으로 안드로이드에 의존적이지 않습니다. 이 경우, 데이터 클래스에 Parcelable을 적용할 수 없습니다. 여기서는 어쩔 수 없이 Serializable 인터페이스를 대신 사용해야 합니다. 다른 대안이 없을지는 좀 더 생각해봐야 하겠습니다.


지난 안드로이드 개발 팁


Layout provided by Steemit Enhancer hommage by ayogom
<

Posted through the ECblog app (https://blog.etain.club)
Sort:  

안녕하세요.
SteemitKorea팀에서 제공하는 'steemit-enhancer'를 사용해 주셔서 감사합니다. 개선 사항이 있으면 언제나 저에게 연락을 주시면 되고, 관심이 있으신 분들은 https://cafe.naver.com/steemitkorea/425 에서 받아보실 수 있습니다. 사용시 @응원해 가 포함이 되며, 악용시에는 모든 서비스에서 제외될 수 있음을 알려드립니다.

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.


안녕하세요.
이 글은 SteemitKorea팀(@ayogom)님께서 저자이신 @dorian-mobileapp님을 응원하는 글입니다.
소정의 보팅을 해드렸습니다 ^^ 항상 좋은글 부탁드립니다
SteemitKorea팀에서는 보다 즐거운 steemit 생활을 위해 노력하고 있습니다.
이 글은 다음날 다시 한번 포스팅을 통해 소개 될 예정입니다. 감사합니다!

Upvoted! Thank you for supporting witness @jswit.

Coin Marketplace

STEEM 0.18
TRX 0.15
JST 0.029
BTC 62571.47
ETH 2429.90
USDT 1.00
SBD 2.66