由于kotlin没有静态字段,我应该在伴侣对象中定义serialVersionUID
吗?
答案 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);
}
}
注释)。