98 votes

Firebase Aucune propriété à sérialiser trouvée sur la classe

Je suis bloqué par la création d'une base de données Firebase.

J'essaie de modéliser une classe. Une classe très simple :

package com.glups.model;

import com.google.firebase.database.IgnoreExtraProperties;

@IgnoreExtraProperties
public class AlumnoFB {

    private String nombre;
    private String apellidos;
    private String telefono;
    private String email;
    private Boolean tieneWhatsapp;
    private Boolean tieneTelegram;
    private Boolean tieneHangouts;
    private Long formaPago;
    private Double ratioHora;
    private Double precioHora;
    private Double horasCompensadas;

    public AlumnoFB() {
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }

    public AlumnoFB(String nombre,
                    String apellidos,
                    String telefono,
                    String email,
                    Boolean tieneWhatsapp,
                    Boolean tieneTelegram,
                    Boolean tieneHangouts,
                    Long formaPago,
                    Double ratioHora,
                    Double precioHora,
                    Double horasCompensadas) {
        this.nombre = nombre;
        this.apellidos = apellidos;
        this.telefono = telefono;
        this.email = email;
        this.tieneWhatsapp = tieneWhatsapp;
        this.tieneTelegram = tieneTelegram;
        this.tieneHangouts = tieneHangouts;
        this.formaPago = formaPago;
        this.ratioHora = ratioHora;
        this.precioHora = precioHora;
        this.horasCompensadas = horasCompensadas;
    }
}

qui est presque comme un exemple de classe de Firebase.

L'utilisateur de l'application obtenu par getUser() a été enregistré sur Firebase.

Lorsque j'appelle SetValue :

AlumnoFB alumno = new AlumnoFB("", "", "", "", false, false, false, ((Integer)FormaPago.INT_NO_PAGADO).longValue(), 0.0, 0.0, 0.0);
    mDatabase.child("AlumnoFB").child(ControlClasesFirebase.getUser().getUid()).setValue(alumno) ;

Une exception fatale est levée.

06-10 10:17:37.179 13841-13841/com.glups.controlclases E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.glups.controlclases, PID: 13841 com.google.firebase.database.DatabaseException: No properties to serialize found on class com.glups.model.AlumnoFB
at com.google.android.gms.internal.zzaix$zza.<init>(Unknown Source)
at com.google.android.gms.internal.zzaix.zzj(Unknown Source)
at com.google.android.gms.internal.zzaix.zzaw(Unknown Source)
at com.google.android.gms.internal.zzaix.zzav(Unknown Source)
at com.google.firebase.database.DatabaseReference.zza(Unknown Source)
at com.google.firebase.database.DatabaseReference.setValue(Unknown Source)
at com.glups.controlclases.MainActivity$4.onClick(MainActivity.java:305)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5258)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

J'ai vérifié les types, et tous sont acceptés. Quel est le problème ?

185voto

Shubhank Points 11083

Firebase exige que votre Pojo ait variables publiques ou getter/setter.

Changez les déclarations de variables en public

public String nombre;
public String apellidos;
public String telefono;
public String email;
public Boolean tieneWhatsapp;
public Boolean tieneTelegram;
public Boolean tieneHangouts;
public Long formaPago;
public Double ratioHora;
public Double precioHora;
public Double horasCompensadas;

1 votes

Cela semble logique. Je n'ai pas encore défini de getters/setter et j'ai l'habitude de définir mes variables POJO comme privées.Cela fonctionne. Merci !

15 votes

Même dans les exemples de la documentation, j'ai constaté que des variables privées étaient utilisées dans les classes de la base de données Firebase, comme 'FriendlyMessage'. J'ai constaté qu'elles fonctionnaient sur mon apk de débogage mais pas sur l'apk de publication. Le fait de tout changer en public (et de déclarer la classe en dehors de l'application principale) a réglé le problème. Toujours des petits pièges avec Android.

1 votes

Il est logique de les utiliser comme public. Lol, je n'aurais pas dû oublier ça

118voto

aselims Points 976

Si vous utilisez proguard, certaines méthodes du modèle peuvent être supprimées en fonction de votre configuration. Comme nous savons qu'il n'y a pas beaucoup d'optimisation pour POJO car il n'y a que des champs avec des getters et/ou (optionnellement) des setters, vous pouvez utiliser l'annotation "@Keep" pour que proguard ne supprime aucune méthode de cette classe.

Vérifiez ceci pour plus d'informations : https://developer.Android.com/studio/build/shrink-code.html

@Keep
public class Store {}

2 votes

Tu es le sauveur de vie, mon frère. Ça marche vraiment après avoir signé l'apk.

0 votes

Cela a finalement résolu mon épreuve de 2 jours et ma lutte pour faire fonctionner la version 'release' de l'application avec la base de données firebase. Debug fonctionnait bien mais pas la version release. Cela aurait dû me donner un indice pour douter de Proguard mais je n'ai pas réussi à le faire. Merci beaucoup d'avoir publié la réponse !

0 votes

Lorsque j'ai écrit ceci dans le fichier proguard- rules.pro, j'ai obtenu cette erreur : ProguardTokenType.CRLF, ProguardTokenType.FLAG_NAME , ProguardTokenType.LINE_CMT or ProguardTokenType.WS expected, got '@'

32voto

Dans mon cas, j'ai oublié d'ajouter une règle proguard pour garder les classes de modèles :

-keep class com.google.firebase.example.fireeats.model.** { *; }

C'est la même chose que la réponse de @aselims, juste la version proguard.

Je l'ai trouvé dans l'exemple officiel de firestore :

https://github.com/firebase/quickstart-Android/blob/master/firestore/app/proguard-rules.pro

0 votes

J'ai eu le même problème après avoir créé l'apk avec proguard.

3voto

Vishu Points 156

J'ai eu ce problème aujourd'hui et je viens de le résoudre en fournissant des getter/setter pour les variables privées.

ex :

private String pid;

public String getPid() {
    return pid;
}

public void setPid(String pid) {
    this.pid = pid;
}

Maintenant, il fonctionne parfaitement sans aucune erreur. J'espère que cela aidera les nouveaux développeurs.

3voto

Ali Akram Points 601

SOLUTION

Dans mon cas, le problème ne concernait que les APK en mode release/signé. J'ai donc résolu le problème en suivant ces étapes

1- Ajout de toutes les classes de modèle dans des règles proguaed comme

-keep class com.YOUR_PACKAGE_NAME.modelClass.** { *; }

OU

@Keep
public class modelClass {}

2- Déclarer toutes les variables de la classe modèle en tant que private

3- Suppression des clés conflictuelles

Chill Pill :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X