如何为kotlin异常生成serialVersionUID?

时间:2015-12-12 15:53:08

标签: serialization kotlin

由于kotlin没有静态字段,我应该在伴侣对象中定义serialVersionUID吗?

3 个答案:

答案 0 :(得分:8)

要在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
    }
}  

这会创建静态字段,但也会在包含的类getSerialVersionUID上创建静态getter MySpecialCase,这是不必要的。

但所有工作都是将serialVersionUID添加到Serializable类的方法。

答案 1 :(得分:3)

是的,您可以在随播对象中声明它。 The doc说:

  

此外,在对象和伴随对象中定义的公共属性以及使用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       
}

答案 2 :(得分:0)

您可以使用此插件GenerateSerialVersionUID自动生成serialVersionUID字段。

由于Kotlin语言不支持静态语言,因此您需要在生成的伴随对象中使用const装饰(当然,也可以使用data: Data[]; csvSeparator = ";"; exportFilename = "exportData"; columns = [ { field: "towerId", header: "towerId", exportable: true }, { field: "towerName", header: "towerName", exportable: false }, { field: "province", header: "province", exportable: true }, { field: "district", header: "district", exportable: true }, { field: "sites.siteId", header: "sitesid", exportable: true, details: true }, { field: "sites.siteName", header: "siteName", exportable: true, details: true } ]; exportCSV() { let csv = ''; const csvHeaders = new Map(); this.data.forEach((record, i) => { for (let i = 0; i < this.columns.length; i++) { const column = this.columns[i]; if (column.exportable !== false && column.field) { if (column.details) { const fields = column.field.split('.'); const detailField = fields[fields.length - 1]; record[fields[0]].forEach((detailRecord, j) => { const csvHeader = '"' + (column.header || column.field) + j + '"'; const detailFieldId = detailField + j; if (!csvHeaders.has(detailFieldId)) { csvHeaders.set(detailFieldId, csvHeader); } let detailCellData = detailRecord[detailField]; if (detailCellData != null) { detailCellData = String(detailCellData).replace(/"/g, '""'); } else { detailCellData = ''; } csv += '"' + detailCellData + '"'; if (i < (this.columns.length - 1)) { csv += this.csvSeparator; } }); } else { const csvHeader = '"' + (column.header || column.field) + '"'; if (!csvHeaders.has(column.field)) { csvHeaders.set(column.field, csvHeader); } let cellData = record[column.field]; if (cellData != null) { cellData = String(cellData).replace(/"/g, '""'); } else { cellData = ''; } csv += '"' + cellData + '"'; if (i < (this.columns.length - 1)) { csv += this.csvSeparator; } } } } csv += '\n'; }); csv = Array.from(csvHeaders.values()).join(this.csvSeparator) + '\n' + csv; const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); if (window.navigator.msSaveOrOpenBlob) { navigator.msSaveOrOpenBlob(blob, this.exportFilename + '.csv'); } else { const link = document.createElement('a'); link.style.display = 'none'; document.body.appendChild(link); if (link.download !== undefined) { link.setAttribute('href', URL.createObjectURL(blob)); link.setAttribute('download', this.exportFilename + '.csv'); link.click(); } else { csv = 'data:text/csv;charset=utf-8,' + csv; window.open(encodeURI(csv)); } document.body.removeChild(link); } } 注释)。