如何为kotlin异常生成serialVersionUID?

由于kotlin没有静态字段,我应该在伴侣对象中定义serialVersionUID吗? IDEA失去了为类生成这个字段的能力…

是的,你可以在伴侣对象中声明它。 该文件说:

此外,在对象和伴随对象中定义的公共属性以及用const注释的顶级属性在Java中变成静态字段

但是私人财产也是如此:

 class MyException: Exception() { companion object { private val serialVersionUid: Long = 1 } } 

javap -c -p com.ninja_squad.kotlindiscovery.MyException.class

 Compiled from "MyException.kt" public final class com.ninja_squad.kotlindiscovery.MyException extends java.lang.Exception { private static final long serialVersionUid; public static final com.ninja_squad.kotlindiscovery.MyException$Companion Companion; static {}; Code: 0: getstatic #38 // Field com/ninja_squad/kotlindiscovery/MyException$Companion.INSTANCE:Lcom/ninja_squad/kotlindiscovery/MyException$Companion; 3: putstatic #40 // Field Companion:Lcom/ninja_squad/kotlindiscovery/MyException$Companion; 6: lconst_1 7: putstatic #21 // Field serialVersionUid:J 10: return public com.ninja_squad.kotlindiscovery.MyException(); Code: 0: aload_0 1: invokespecial #15 // Method java/lang/Exception."<init>":()V 4: return public static final long access$getSerialVersionUid$cp(); Code: 0: getstatic #21 // Field serialVersionUid:J 3: lreturn } 

要为Kotlin中的类创建serialVersionUID ,您有几个选项都需要将成员添加到类的伴随对象中。

最简洁的字节码来自private const val ,它将成为包含类的私有静态变量,在这种情况下是MySpecialCase

 class MySpecialCase : Serializable { companion object { private const val serialVersionUID: Long = 123 } } 

你也可以使用这些形式, 每种形式都具有getter / setter方法的副作用,而这些方法不是序列化所必需的。

 class MySpecialCase : Serializable { companion object { private val serialVersionUID: Long = 123 } } 

这创建了静态字段,但也创建了一个getter以及getSerialVersionUID对伴随对象是不必要的。

 class MySpecialCase : Serializable { companion object { @JvmStatic private val serialVersionUID: Long = 123 } } 

这创建了静态字段,但也创建了一个静态的getter以及包含的MySpecialCase类的getSerialVersionUID ,这是不必要的。

但是,所有这些都是将serialVersionUID添加到Serializable类的方法。

Interesting Posts