【问题标题】:Serializable in Kotlin在 Kotlin 中可序列化
【发布时间】:2016-12-15 15:09:22
【问题描述】:

在我的 Android 应用程序中,我有一个 TreeMap,我可以很高兴地输入一个 Bundle 喜欢

bundle.putSerializable("myHappyKey", myHappyTreeMap);

但现在我将我的应用程序移植到 Kotlin,Android Studio 抱怨 Serializable! 是必需的,但它却找到了 Map

我该如何处理?

编辑如果我将地图投射到Serializable,警告似乎消失了。是这样吗?

EDIT 2 我将myHappyTreeMap 声明并初始化为

var myHappyTreeMap: Map<Int, Double> = mapOf()

documentation 表示使用mapOf() 初始化的映射是可序列化的。如果文档这么说……

【问题讨论】:

  • 你的地图有哪些类型?这两种类型是Serializable?

标签: android kotlin


【解决方案1】:

TreeMap 和其他各种Map 实现实现了Serializable,但Map 接口本身并没有实现Serializable

我看到了一些选项:

  1. 确保myHappyTreeMap 的类型不仅仅是Map,而是TreeMap 或其他实现SerializableMap 子类型。例如:

    val myHappyTreeMap: TreeMap = ...
    
  2. 将您的Map 实例转换为Serializable(仅在您知道Map 实例类型实现Serializable 时推荐,否则您将获得ClassCastException)。例如:

    bundle.putSerializable("myHappyKey", myHappyTreeMap as Serializable)
    
  3. 检查您的Map 实例,如果不是Serializable,则使用Map 实现复制它。例如:

    bundle.putSerializable("myHappyKey", when (myHappyTreeMap) {
        is Serializable -> myHappyTreeMap
        else -> LinkedHashMap(myHappyTreeMap)
    })
    

【讨论】:

  • 假设我更喜欢转换为Serializable,我怎么能确定我声明为Map&lt;Int, Double&gt;Map,例如,并使用mapOf() 进行初始化将实现Serializable?
  • 啊,文档 (kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/…) 说这些映射是可序列化的。在实践中,我发现它会生成一个 LinkedHashMap。这在未来可能不是真的,但如果文档说mapOf() 产生Serializable,那么可以安全地假设它会工作™。
  • @Morpheu5 我已经根据您的 cmets 更新了答案中的第二个选项,并且还添加了第三个选项(首先检查 is Serializable,然后在必要时复制地图)。
  • 我应该补充一点,至少在这种情况下,我真的不在乎地图是否是 TreeMap,这是我最初用 Java 编写代码时使用的脚趾。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-10
  • 2022-08-19
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-19
  • 1970-01-01
相关资源
最近更新 更多