-
TypeSafe navigation 에서 '/' 을 포함할 수 있는 객체의 직렬화 시 주의해야합니다IT/android 2025. 3. 4. 17:10SMALL
Android navigation 시스템에서 TypeSafe 를 정식으로 지원하게 되면서 현재 진행중인 사이드프로젝트에도 도입을 해보았습니다.
그런데 Route 객체 내부에 Primitive 타입이 아닌 Object 를 넣고 라우팅 처리를 할때 특정상황에서 오류가 발생하였습니다.
오류문구는 다음과 같았습니다
java.lang.IllegalArgumentException: Navigation destination that matches route com.lanpet.free.navigation.FreeBoardCommentDetail/01JNFSERY5NJAVR9JZNKNSBYHW/{"id":"01JNG2R9XJDZANT33HCV2E1JA5","profile":{"nickname":"gpffh1","profileImage":"https://test.resource.lanpet.co.kr/profile/01JMS4TKTMN7QRTZ458D5GTVCJ/resource-0.jpeg"},"comment":"waefwefwef","createdAt":"2025-03-04T08:00:54.824Z"} cannot be found in the navigation graph ComposeNavGraph(0x0)
결론적으로는 해당 라우팅 Path 를 Navigation Graph 내에서 찾을 수 없다는 이야기인데요, 문제는 직렬화 과정중에 profileImage 의 값 중에 "/" Slash 문자가 포함되어 Path 를 잘못 인식하고 있었습니다.
즉 기본 정의된 Path 가 ROOT/{ID}/{OBJECT} 형식이라면 잘못된 Path 는 ROOT/{ID}/asdf/e/f/s//wef/ 뭐 이런식으로 경로가 잘못된다는 것이죠.
가장 먼저 떠올랐던건 Base64 로 Url 인코딩을 해서 마샬링을 거치면 해결되지 않을까 했습니다.
@Serializable data class Profile( val nickname: String, @Serializable(with = Base64StringSerializer::class) val profileImage: String?, ) object Base64StringSerializer : KSerializer<String> { override val descriptor: SerialDescriptor get() = String.serializer().descriptor override fun serialize( encoder: Encoder, value: String, ) { val base64Encoded = android.util.Base64.encode(value.toByteArray(), android.util.Base64.URL_SAFE) encoder.encodeString(String(base64Encoded)) } override fun deserialize(decoder: Decoder): String { val base64Decoded = android.util.Base64.decode(decoder.decodeString(), android.util.Base64.URL_SAFE) return String(base64Decoded) } }
저는 직렬화과정에서 편의상 @Serializable 을 사용하고있었기에 별도의 Base64Serializer 을 만들어주고 이를 사용하는 방식으로 구현하였습니다.
결론적으로 해당 인코딩을 통해 "/" Slash 문자는 다른 문자로 대체되어 정상적으로 경로를 찾을 수 있게 되었습니다.
문제를 해결한 뒤 다른 더 좋은 방법이 있는지 찾아보았었는데요, https://stackoverflow.com/questions/78813543/issue-with-androidx-navigation-library-and-slash-sign
Issue with androidx.navigation library and slash sign
Issue description: When I try to create custom navigation type and navigate to certain destination in my NavGraph, I get error, which states, that this certain destination cannot be found in the gr...
stackoverflow.com
위 글의 게시자도 저와 같은 문제를 경험했고, 답변들도 저와 비슷하게 인코딩을 통해서 해결을 했습니다.
TypeSafe Navigation 을 사용할때 객체의 직렬화의경우 URL base 또는 "/" 가 포함될 가능성이 있다면 유의해서 사용해야할 것 같습니다.
LIST'IT > android' 카테고리의 다른 글
Gradle 훑어보기4 - 빌드파일 기본사항 (2) 2024.12.14 Gradle 훑어보기3 - 설정파일 기본사항 (0) 2024.12.14 Gradle 훑어보기2 - Gradle Wrapper 기본사항 (0) 2024.12.14 Gradle 훑어보기1 - 기본사항 (1) 2024.12.14 DoveLetter interview question 훑어보기1 (1) 2024.12.09