如何在Kotlin中序列化/反序列化Custom对象数组?

lol*_*f64 4 arrays serialization kotlin

在我的Kotlin Android项目中,我创建了一个扩展Serializable的FileItem类

class FileItem(<parameters>) : Serializable, Comparable<FileItem> {
Run Code Online (Sandbox Code Playgroud)

所以我需要将此类的实例序列化为Bundle

val arguments:Bundle = Bundle()
arguments.putSerializable("folders", folders as Serializable)
Run Code Online (Sandbox Code Playgroud)

其中文件夹已声明为:

folders:Array<FileItem> (method parameter)
Run Code Online (Sandbox Code Playgroud)

上面的序列化代码编译没有任何警告.同时,当我需要反序列化文件夹项时出现问题:

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

其中的foldersItems声明为

var foldersItems: Array<FileItem>?
Run Code Online (Sandbox Code Playgroud)

我得到以下警告,如果没有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>
Run Code Online (Sandbox Code Playgroud)

这种代码在Java/Groovy中编译而没有警告(folderItems则是FileItem []),那么如何修改kotlin代码以使编译器"满意"?

在Kotlin官方文档中注意到Kotlin Array没有扩展Serializable并且不能继承.是否有可能通过一种扩展方法"添加"它?

hot*_*key 5

事实上,演员表并未取消选中,编译器的警告会产生误导.

发生这种情况是因为Kotlin数组由泛型类表示Array<T>,并且编译器将其视为通常的泛型类,其类型参数在运行时被擦除.

但是在JVM 数组上已经有了类型化,当你进行转换时something as Array<SomeType>,生成的字节码实际上会检查类型参数是否SomeType也是something一个Array<*>,这只会发生在任何其他泛型类中.

此示例显示已检查数组强制转换:

val a: Any = Array<Int>(1) { 0 }

val i = a as Array<Int>
val d = a as Array<Double> // gets checked and throws ClassCastException
Run Code Online (Sandbox Code Playgroud)

确实最简单的解决方案是@Suppress("UNCHECKED_CAST"),因为实际上不应该有任何警告.

我提起了问题描述科特林问题跟踪器的问题.