【问题标题】:Numbers in kotlin is not serializablekotlin 中的数字不可序列化
【发布时间】:2014-10-04 20:17:48
【问题描述】:

我发现 kotlin 中的数字是不可序列化的。

  1. 第一个问题

Device.kt:

package test.domain

import javax.persistence.*

Entity public class Device {
    public Id GeneratedValue var id: Long = -1
    public var name: String = ""
    ...
}

DeviceRestRepository.kt:

package test.domain

import org.springframework.data.repository.PagingAndSortingRepository
import org.springframework.data.repository.query.Param
import org.springframework.data.rest.core.annotation.RepositoryRestResource

RepositoryRestResource(collectionResourceRel = "device", path = "device")
public trait DeviceRestRepository : PagingAndSortingRepository<Device, Long?> {
    public fun findByName(Param("name") name: String): List<Device>
}

当我尝试编译此代码时出现错误,因为 kotlin.Long 不是 Serializable

错误:(14, 72) Kotlin:类型参数不在其范围内:应该 是 'java.io.Serializable?' 的子类型?

  1. 第二个问题

我在尝试使用 java.lang.Long 时遇到同样的错误:

DeviceRestRepository.kt:

package test.domain

import org.springframework.data.repository.PagingAndSortingRepository
import org.springframework.data.repository.query.Param
import org.springframework.data.rest.core.annotation.RepositoryRestResource

RepositoryRestResource(collectionResourceRel = "device", path = "device")
public trait DeviceRestRepository : PagingAndSortingRepository<Device, java.lang.Long?> {
    public fun findByName(Param("name") name: String): List<Device>
}

警告:(14, 72) Kotlin:不应在 Kotlin 中使用此类。利用 kotlin.Long 代替。

错误:(14, 72) Kotlin: 类型参数不是 在其范围内:应该是 'java.io.Serializable?' 的子类型?

【问题讨论】:

  • 虽然您的解决方法已经足够好(恭喜您找到它!),但这是 Kotlin 基础架构中的一个问题,我们会尽力解决它。请观看此问题以获取有关我们进度的通知:youtrack.jetbrains.com/issue/KT-5821
  • AndreyPaslavsky 感谢@AndreyBreslav 的解决方法,很高兴听到这将得到解决。如果你能澄清一下为什么 java.lang.Long 从 Kotlin 的角度来看是不可序列化的,而它在 Java 中是可序列化的?谢谢。
  • @beegor, java.lang.Long 不可序列化,因为 Kotlin 将其视为不可序列化的 kotlin.Number(不是 java.lang.Number)的子类。当 Kotlin 调用 Java 方法时,此映射 j.l.Number -&gt; k.Number 是使 Kotlin/Java 互操作顺利工作所必需的
  • 嗯,虽然此解决方案适用于从数据库读取,但插入新记录无法正常工作,ID 始终为 -1,而不是由 DB (postgresql) 生成。我在这里错过了什么吗?
  • 在下面查看我的新答案,这不再是问题。可以审核确认吗?

标签: spring serialization kotlin spring-data-jpa


【解决方案1】:

从 Kotlin 1.0 Beta 1 开始,原语类型是可序列化的:

Int 是可序列化的

现在类型 Int 和其他基本类型在 JVM 上是可序列化的。这应该有助于许多框架。

来自: http://blog.jetbrains.com/kotlin/2015/10/kotlin-1-0-beta-candidate-is-out/

因此您不再有任何问题。

【讨论】:

    【解决方案2】:

    我找到了这个问题的解决方法:

    Device.kt:

    package test.domain
    
    import javax.persistence.*
    
    Entity public class Device {
        public EmbeddedId var id: DeviceId = DeviceId()
        public var name: String = ""
        ...
    }
    
    Embeddable public class DeviceId: Serializable {
        public GeneratedValue var id: Long = -1
    }
    

    DeviceRestRepository.kt:

    package test.domain
    
    import org.springframework.data.repository.PagingAndSortingRepository
    import org.springframework.data.repository.query.Param
    import org.springframework.data.rest.core.annotation.RepositoryRestResource
    
    RepositoryRestResource(collectionResourceRel = "device", path = "device")
    public trait DeviceRestRepository : PagingAndSortingRepository<Device, DeviceId?> {
        public fun findByName(Param("name") name: String): List<Device>
    }
    

    这个用例很好用

    【讨论】:

      【解决方案3】:

      我偶然发现了同样的问题,我设法通过在 java 中使用我的 Repository 接口来处理它,我将 java.lang.Long 作为 id 的泛型类型参数。其余的留在 kotlin 中(数据类、服务类等)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-12
        • 2012-07-05
        • 2021-11-29
        • 1970-01-01
        • 2021-07-28
        • 1970-01-01
        相关资源
        最近更新 更多