Игнорировать первичный ключ при сериализации с использованием Gson - PullRequest
1 голос
/ 09 октября 2019

Я делаю решение для экспорта / импорта для моего приложения с использованием GSON и сохраняю его в ExternalStorage. Я хочу сериализовать все поля, кроме PrimaryKey. При десериализации и добавлении элементов в БД я хочу автоматически сгенерировать PrimaryKey.

Единственное решение, которое я нашел, - это использовать @ Transient , но это хорошее решение или оно делаетесть минусы? Любые другие предложения?

@Entity(tableName = "item")
data class Item(
    @ColumnInfo(name = "name") val name: String,
    @ColumnInfo(name = "data", typeAffinity = ColumnInfo.BLOB) val DataItem: FloatArray,
    @ColumnInfo(name = "created_at") var createdAt: Long = System.currentTimeMillis()
) {
    @Transient @PrimaryKey(autoGenerate = true) @ColumnInfo(name = "id") var id: Int = 0
}

1 Ответ

3 голосов
/ 09 октября 2019

Я вижу некоторые побочные эффекты - переходные процессы делают файл полностью не сериализуемым (например, когда в пакете установлено значение argument, предполагая, что Item будет Serializable), не только для GSON.

Итак, одна из возможностей, которую я вижу, это добавить SerializationStrategy для GSON:

import android.arch.persistence.room.PrimaryKey
import com.google.gson.FieldAttributes
import com.google.gson.ExclusionStrategy
import com.google.gson.GsonBuilder
import com.google.gson.Gson


GsonBuilder()
    .addSerializationExclusionStrategy(object : ExclusionStrategy {
        override fun shouldSkipField(f: FieldAttributes): Boolean {
            return f.annotations.any { it is PrimaryKey }
        }

        override fun shouldSkipClass(aClass: Class<*>): Boolean {
            return false
        }
    }
).create()

Но он не будет сериализовать каждое поле, помеченное @PrimaryClass. Другой способ будет использовать @Expose с параметром serialize = false:

@Expose(serializable = false) @PrimaryKey var id: Int = 0

Тогда поданное будет исключено из сериализации. Вы можете увидеть документы Expose здесь: https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google/gson/annotations/Expose.html

...