2017-05-22 3 views
1

Im un peu confus pour ma classe Kotlin ne fonctionne pas comme prévu:données Kotlin classe Gson question de sérialisation

la classe de données utilisée pour vérifier mettre à jour les informations:

data class UpdateInfo constructor(//kotlin class 
    val description: String, 
    val force: Int, 
    val platform: String, 
    val title: String, 
    val url: String, 
    @SerializedName("version") 
    val versionCode: Int = 0 
) : Serializable { 
    val isForceUpdate = force == 1 
} 

également util utilisé pour décoder la forme d'objet JSON:

public class JsonUtil {//java class 
    private static final Gson gson; 
    static { 
     BooleanAdapter booleanAdapter = new BooleanAdapter(); 
     gson = new GsonBuilder() 
      .serializeNulls() 
      .disableHtmlEscaping() 
      .setLenient() 
      .registerTypeAdapter(Boolean.class, booleanAdapter) 
      .registerTypeAdapter(boolean.class, booleanAdapter) 
      .create(); 
    } 
} 

quand je le tester:

val json = "{\"force\"=\"1\"}" 
val info = JsonUtil.fromJsonObject(json, UpdateInfo::class.java) 
println(info) 
println(info.force == 1) 
println(info.isForceUpdate) 

je reçois:

UpdateInfo(description=null, force=1, platform=null, title=null, url=null,versionCode=0) 
true 
false 

Quoi ?? info.isForceUpdate = faux ???
Ensuite, j'ai essayé lateinit ou by lazy{}, ne fonctionne toujours pas. Alors, que dois-je faire .. J'utilise info.force==1 directement maintenant, mais je veux toujours savoir pourquoi cela s'est produit.

+0

S'il vous plaît vérifiez si cela aide: http://stackoverflow.com/questions/39962284/gson-deserialization-with-kotlin-initializer-block-not-called – hotkey

+0

Si vous voulez que votre constructeur soit appelé correctement par la bibliothèque de sérialisation (Au lieu d'utiliser 'Unsafe' pour l'instancier), vous pourriez être intéressé par [Moshi] (https://medium.com/square-corner-blog/kotlins-a-great-language-for-json-fcd6ef99256b), ce qui, à certains égards, peut être considéré comme un successeur de Gson. –

Répondre

2

Le problème est que la propriété val isForceUpdate = force == 1 est calculée une fois à l'instanciation de la classe, puis stockée dans un champ. Parce que Gson utilise Unsafe pour instancier la classe, le champ est défini à sa valeur par défaut false.

Tout ce que vous devez faire pour résoudre ce problème est de changer la propriété d'une propriété calculée:

val isForceUpdate get() = force == 1 

de telle sorte que la valeur est calculée sur un appel et ne sont pas stockées dans un champ.

+0

merci, cela fonctionne. – XieEDeHeiShou