¿Cómo serializar / deserializar una matriz de objects personalizados en Kotlin?

En mi proyecto Android de Kotlin, hice una class FileItem que amplía Serializable

class FileItem(<parameters>) : Serializable, Comparable<FileItem> { 

Así que necesitaba serializar instancias de esta class en un package

 val arguments:Bundle = Bundle() arguments.putSerializable("folders", folders as Serializable) 

donde las carpetas han sido declaradas como:

 folders:Array<FileItem> (method parameter) 

El código de serialization anterior se comstack sin ninguna advertencia. Mientras tanto, el problema surge cuando necesito deserializar elementos de las carpetas:

 val arguments: Bundle? = getArguments() if (arguments != null){ foldersItems = arguments.getSerializable("folders") as Array<FileItem> 

donde foldersItems se declara como

 var foldersItems: Array<FileItem>? 

Recibo la siguiente advertencia, que no puedo resolver sin la anotación suppress_warning :

 w: <Path to my class>: (78, 28): Unchecked cast: java.io.Serializable! to kotlin.Array<com.loloof64.android.chess_positions_archiver.main_file_explorer.FileItem> 

Este tipo de código se comstack en Java / Groovy sin previo aviso (folderItems es entonces FileItem []), entonces ¿cómo puedo modificar el código de kotlin para que el comstackdor quede "satisfecho"?

Noté en la documentation oficial de Kotlin que Kotlin Array no extiende Serializable y no está abierto para inheritance. ¿Es posible que meanwhite "lo agregue" a través de un tipo de método de extensión?

De hecho, el reparto no está desmarcado, la advertencia del comstackdor es engañosa.

Esto sucede porque en los arreglos de Kotlin están representados por la class genérica Array<T> , y el comstackdor lo trata como una class genérica habitual con parameters de tipo borrados en el time de ejecución.

Pero en las matrices JVM tienen types reificados , y cuando lanzas something as Array<SomeType> , el bytecode generado realmente comtesting que el parámetro type sea SomeType y que something sea ​​un Array<*> , lo que sucedería solo con cualquier otra class genérica .

Este ejemplo muestra que el molde de la matriz está marcado:

 val a: Any = Array<Int>(1) { 0 } val i = a as Array<Int> val d = a as Array<Double> // gets checked and throws ClassCastException 

La solución más fácil es, de hecho, a @Suppress("UNCHECKED_CAST") , porque en realidad no debería haber ninguna advertencia.

Archivé un problema que describía el problema en el rastreador de problemas de Kotlin.

El molde aquí no está marcado porque el comstackdor aquí no puede garantizar la nulabilidad del parámetro de tipo genérico de la matriz.

Considere el siguiente ejemplo:

 fun castAsArrayOfString(param: Any) = param as Array<String> castAsArrayOfString(arrayOf("a")) // is Array<String>, all ok castAsArrayOfString(arrayOf("a", null)) // is Array<String>, but contains null 

Por lo tanto, el comstackdor le advierte sobre posibles problemas de security de tipo que este elenco podría introducir.