Kotlin의 data class에 배열을 넣으면 toString () 에 배열된 내용이 모두 표시됩니다. 곤란하면
TL;DR(길다! 3줄!)
입문
Kotlin의 데이터 클래스로 촬영한 사진의 JPEG Buffer와 저장지 File 이름과 Meta Data 등 세트의 용기류↓는 Kotlin의 데이터 클래스가 가볍다면 좋겠다고 생각합니다.
PhotoData.ktdata class PhotoData(val filepath: String, val jpeg: ByteArray, val meta: String) {
}
하지만 저장 Thread에서 PhotoData#toString()을 사용하여 로그 출력을 할 때
이렇게byte는 하나하나 Int로 변환되고 모든 요소가 표시되며 배열된 단말기나logcat의 1행문 버퍼가 사라지거나 표시됩니다.
JPEG 데이터가 같은 건지 다른 건지 알고 싶을 뿐이지만 그렇다면 귀찮을 테니 어떻게든 해결해 보자.
하고 싶은 일
데이터 클래스에byte 배열 등을 저장할 때도 배열 전체를 표시하는 것이 아니라 배열이 같은지 다른지 알 수 있는 정도에 toString () 으로 yoroshicllog 출력을 하려고 합니다.
Kotlin의 데이터 클래스는 어떻게 Java로 변환됩니까?
따라서 데이터 클래스에서 자동으로 생성되는 toString () 이 JAVA 변환 후 어떤 코드로 바뀌었는지 살펴보겠습니다.
↓ 웹 사이트를 참조하여 Kotlin 코드를 JAVA로 변환합니다.
http://tech.actindi.net/2016/12/15/kotlin.html
PhotoData.ktdata class PhotoData(val filepath: String, val jpegBuffer: ByteArray) {
}
이 데이터 클래스에서 자동으로 생성되는 toString () 코드가 JAVA로 변환되면 ↓ 과 같습니다.
PhotoData.javapublic final class PhotoData
{
public String toString()
{
return (new StringBuilder())
.append("PhotoData(fileFullPath=")
.append(fileFullPath)
.append(", jpegBuffer=")
.append(Arrays.toString(jpegBuffer))
.append(")")
.toString();
}
}
이 안에 있어요.Arrays.toString(jpegBuffer)
배열이 모두 나오는 주요 원인이다.
Array #toString () 의 사양을 찾았습니다. ↓ 과 같이 StringBuilder를 사용하여 byte를 문자열에 하나씩 밀어넣습니다.
Arrays.javapublic static String toString(byte[] array) {
if (array == null) {
return "null";
}
if (array.length == 0) {
return "[]";
}
StringBuilder sb = new StringBuilder(array.length * 6);
sb.append('[');
sb.append(array[0]);
for (int i = 1; i < array.length; i++) {
sb.append(", ");
sb.append(array[i]);
}
sb.append(']');
return sb.toString();
}
나는 바이트 배열이나 Arrays 같은 것에 손발을 대고 행동을 바꿀 수 없지만 안 될 것 같다.
(사실은 할 수 있어! 이런 게 있으면 알고 싶어!)
ByteArray만 저장하는class 만들기
byte 수조를 데이터 클래스에 고스란히 저장하면 Arrays #toString () 을 사용하기 때문에 아예 수조만 저장하는class를 따로 만들어 끼워 넣고, 이class의toString () override를 사용하면 byte 수조의 직접 출력을 피할 수 있습니다.
↓ 이런 느낌
PhotoData.ktclass ByteBuffer(val buffer: ByteArray) {
override fun toString(): String {
return "${buffer.hashCode()}"
}
}
data class PhotoData(val fileFullPath: String, val jpeg: ByteBuffer) {
}
이 구조로logcat에 실제 출력,
PhotoData(
fileFullPath=/storage/emulated/0/2017-07-29_151933.JPG,
jpeg=164835622
)
이런 느낌의 출력은 같은 배열의 정도인지 아닌지를 판단할 수 있는 좋은 느낌의logcat이다.
총결산
데이터 클래스에 장수 그룹을 추가해도 로그캣은 파괴되지 않습니다.
Kotlin의 데이터 클래스는 매우 편리하지만 Array에 가입했을 때의 toString () 의 표준 행위만 유감입니다.
다른 더 좋은 방법이 있을 것 같아서요.
---///
Reference
이 문제에 관하여(Kotlin의 data class에 배열을 넣으면 toString () 에 배열된 내용이 모두 표시됩니다. 곤란하면), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fezrestia/items/d57fe4bb28c3ca3cbc9a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
data class PhotoData(val filepath: String, val jpeg: ByteArray, val meta: String) {
}
데이터 클래스에byte 배열 등을 저장할 때도 배열 전체를 표시하는 것이 아니라 배열이 같은지 다른지 알 수 있는 정도에 toString () 으로 yoroshicllog 출력을 하려고 합니다.
Kotlin의 데이터 클래스는 어떻게 Java로 변환됩니까?
따라서 데이터 클래스에서 자동으로 생성되는 toString () 이 JAVA 변환 후 어떤 코드로 바뀌었는지 살펴보겠습니다.
↓ 웹 사이트를 참조하여 Kotlin 코드를 JAVA로 변환합니다.
http://tech.actindi.net/2016/12/15/kotlin.html
PhotoData.ktdata class PhotoData(val filepath: String, val jpegBuffer: ByteArray) {
}
이 데이터 클래스에서 자동으로 생성되는 toString () 코드가 JAVA로 변환되면 ↓ 과 같습니다.
PhotoData.javapublic final class PhotoData
{
public String toString()
{
return (new StringBuilder())
.append("PhotoData(fileFullPath=")
.append(fileFullPath)
.append(", jpegBuffer=")
.append(Arrays.toString(jpegBuffer))
.append(")")
.toString();
}
}
이 안에 있어요.Arrays.toString(jpegBuffer)
배열이 모두 나오는 주요 원인이다.
Array #toString () 의 사양을 찾았습니다. ↓ 과 같이 StringBuilder를 사용하여 byte를 문자열에 하나씩 밀어넣습니다.
Arrays.javapublic static String toString(byte[] array) {
if (array == null) {
return "null";
}
if (array.length == 0) {
return "[]";
}
StringBuilder sb = new StringBuilder(array.length * 6);
sb.append('[');
sb.append(array[0]);
for (int i = 1; i < array.length; i++) {
sb.append(", ");
sb.append(array[i]);
}
sb.append(']');
return sb.toString();
}
나는 바이트 배열이나 Arrays 같은 것에 손발을 대고 행동을 바꿀 수 없지만 안 될 것 같다.
(사실은 할 수 있어! 이런 게 있으면 알고 싶어!)
ByteArray만 저장하는class 만들기
byte 수조를 데이터 클래스에 고스란히 저장하면 Arrays #toString () 을 사용하기 때문에 아예 수조만 저장하는class를 따로 만들어 끼워 넣고, 이class의toString () override를 사용하면 byte 수조의 직접 출력을 피할 수 있습니다.
↓ 이런 느낌
PhotoData.ktclass ByteBuffer(val buffer: ByteArray) {
override fun toString(): String {
return "${buffer.hashCode()}"
}
}
data class PhotoData(val fileFullPath: String, val jpeg: ByteBuffer) {
}
이 구조로logcat에 실제 출력,
PhotoData(
fileFullPath=/storage/emulated/0/2017-07-29_151933.JPG,
jpeg=164835622
)
이런 느낌의 출력은 같은 배열의 정도인지 아닌지를 판단할 수 있는 좋은 느낌의logcat이다.
총결산
데이터 클래스에 장수 그룹을 추가해도 로그캣은 파괴되지 않습니다.
Kotlin의 데이터 클래스는 매우 편리하지만 Array에 가입했을 때의 toString () 의 표준 행위만 유감입니다.
다른 더 좋은 방법이 있을 것 같아서요.
---///
Reference
이 문제에 관하여(Kotlin의 data class에 배열을 넣으면 toString () 에 배열된 내용이 모두 표시됩니다. 곤란하면), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fezrestia/items/d57fe4bb28c3ca3cbc9a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
data class PhotoData(val filepath: String, val jpegBuffer: ByteArray) {
}
public final class PhotoData
{
public String toString()
{
return (new StringBuilder())
.append("PhotoData(fileFullPath=")
.append(fileFullPath)
.append(", jpegBuffer=")
.append(Arrays.toString(jpegBuffer))
.append(")")
.toString();
}
}
public static String toString(byte[] array) {
if (array == null) {
return "null";
}
if (array.length == 0) {
return "[]";
}
StringBuilder sb = new StringBuilder(array.length * 6);
sb.append('[');
sb.append(array[0]);
for (int i = 1; i < array.length; i++) {
sb.append(", ");
sb.append(array[i]);
}
sb.append(']');
return sb.toString();
}
byte 수조를 데이터 클래스에 고스란히 저장하면 Arrays #toString () 을 사용하기 때문에 아예 수조만 저장하는class를 따로 만들어 끼워 넣고, 이class의toString () override를 사용하면 byte 수조의 직접 출력을 피할 수 있습니다.
↓ 이런 느낌
PhotoData.kt
class ByteBuffer(val buffer: ByteArray) {
override fun toString(): String {
return "${buffer.hashCode()}"
}
}
data class PhotoData(val fileFullPath: String, val jpeg: ByteBuffer) {
}
이 구조로logcat에 실제 출력,PhotoData(
fileFullPath=/storage/emulated/0/2017-07-29_151933.JPG,
jpeg=164835622
)
이런 느낌의 출력은 같은 배열의 정도인지 아닌지를 판단할 수 있는 좋은 느낌의logcat이다.총결산
데이터 클래스에 장수 그룹을 추가해도 로그캣은 파괴되지 않습니다.
Kotlin의 데이터 클래스는 매우 편리하지만 Array에 가입했을 때의 toString () 의 표준 행위만 유감입니다.
다른 더 좋은 방법이 있을 것 같아서요.
---///
Reference
이 문제에 관하여(Kotlin의 data class에 배열을 넣으면 toString () 에 배열된 내용이 모두 표시됩니다. 곤란하면), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/fezrestia/items/d57fe4bb28c3ca3cbc9a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Kotlin의 data class에 배열을 넣으면 toString () 에 배열된 내용이 모두 표시됩니다. 곤란하면), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/fezrestia/items/d57fe4bb28c3ca3cbc9a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)