gpt4 book ai didi

arrays - 如何在 Kotlin 中序列化/反序列化自定义对象数组?

转载 作者:行者123 更新时间:2023-12-05 00:19:01 32 4
gpt4 key购买 nike

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

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

所以我需要将这个类的实例序列化为一个 Bundle
val arguments:Bundle = Bundle()
arguments.putSerializable("folders", folders as Serializable)

其中文件夹已声明为:
folders:Array<FileItem> (method parameter)

上面的序列化代码编译时没有任何警告。同时,当我需要反序列化文件夹项目时,问题就出现了:
val arguments: Bundle? = getArguments()
if (arguments != null){
foldersItems = arguments.getSerializable("folders") as Array<FileItem>

其中foldersItems被声明为
var foldersItems: Array<FileItem>?

我收到以下警告,我无法解决 没有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>

这种代码在 Java/Groovy 中编译时没有警告(folderItems 然后是 FileItem[]),那么我该如何修改 kotlin 代码以使编译器“满意”?

我注意到 in official Kotlin documentation Kotlin Array 不扩展 Serializable 并且不开放继承。是否可以通过一种扩展方法来“添加”它?

最佳答案

事实上,强制转换并非未经检查,编译器的警告具有误导性。

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

但是在 JVM 上 arrays have reified types ,当你施放 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

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

我提交了 issue在 Kotlin 问题跟踪器中描述问题。

关于arrays - 如何在 Kotlin 中序列化/反序列化自定义对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36687780/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com