Firebase No properties to serialize found on class

JavaAndroidFirebaseFirebase Realtime-Database

Java Problem Overview


I'm bloqued creating a Firebase Database.

I'm trying to model a class. A very simple class:

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;
    }
}

that is almost like a sample class from Firebase.

Application user obtained from getUser() has been logged on Firebase.

When I call 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) ;

A fatal exception raises.

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)

I've checked types, and all are accepted. What's wrong?

Java Solutions


Solution 1 - Java

Firebase require your Pojo to have public variables or getter/setter.

Change variable declarations to 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;

Solution 2 - Java

If you are using proguard, some methods in the model could be stripped out depending on your configuration. As we know that there is no much optimization to POJO as it has only fields with getters and/or (optionally) setters, you can use the annotation "@Keep" so proguard will not delete any methods from this class.

Check this for more info: https://developer.android.com/studio/build/shrink-code.html

@Keep
public class Store {}

Solution 3 - Java

In my case I forgot to add a proguard rule to keep the model classes:

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

This is same as @aselims's answer, just proguard version.

I found it in the official firestore example:

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

Solution 4 - Java

I have got this issue today and just resolve this providing getter/setter for private variables.

ex:

private String pid;

public String getPid() {
    return pid;
}

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

Now it's work perfectly without any error. Hope it will help newbies devs.

Solution 5 - Java

SOLUTION

In my case the issue was only in release/signed mode APK. So I fixed by doing these steps..

1- Added all model classes into proguaed rules like

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

OR

@Keep
public class modelClass {}

2- Declared all variables of model class as private

3- Removed conflicting keys

Chill Pill :)

Solution 6 - Java

Verify this:

buildTypes {
    release {
        minifyEnabled false
        ...
    }
    debug {
        minifyEnabled false
        ...
    }
}

Solution 7 - Java

Declare variables as public.

public String email

Solution 8 - Java

In case anyone runs into this and none of the above solutions work, the variables declared also need to be of Object type and not raw types.

For example, you can use Integer's but you cannot use int's.

Same is true for boolean, float, double, etc. Basically, any unboxed type.

Solution 9 - Java

adding

@ServerTimeStamp
public Date date; 

helped me to resolve the issue

Solution 10 - Java

You can do either of the two things -

  1. Make your variables public OR
  2. Add getters and setters for all the variables

Solution 11 - Java

To solve the issue as mentionned below you should declare the class as Serializable and for the code :

`data class Review(
    var rating:Float=0f,
    var userId:String="",
    var textR:String="",
    @ServerTimestamp var timestamp: Date? = null
 ):Serializable{
constructor( rating: Float,userId: String, text: String):this() {
    this.userId = userId
    this.rating = rating
    this.textR = text
}
}`

Solution 12 - Java

Try This Solution!

1- Implement Serializable interface

class model implements Serializable {}

2- Class Model with Private properties with Constructor and public setter and getter methods

public class Message implements Serializable {

@ServerTimestamp
private Date created;

private String content;
private String from;
private String to;

public Message(Date created, String content, String from, String to) {
    this.created = created;
    this.content = content;
    this.from = from;
    this.to = to;
}

public Date getCreated() {
    return created;
}

public void setCreated(Date created) {
    this.created = created;
}

public String getContent() {
    return content;
}

public void setContent(String content) {
    this.content = content;
}

public String getFrom() {
    return from;
}

public void setFrom(String from) {
    this.from = from;
}

public String getTo() {
    return to;
}

public void setTo(String to) {
    this.to = to;
}

}

3- add this code in Proguard rules as said here

    # Add this global rule
-keepattributes Signature

# This rule will properly ProGuard all the model classes in
# the package com.yourcompany.models.
# Modify this rule to fit the structure of your app.
-keepclassmembers class com.yourcompany.models.** {
  *;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionEulerVenView Question on Stackoverflow
Solution 1 - JavaShubhankView Answer on Stackoverflow
Solution 2 - JavaaselimsView Answer on Stackoverflow
Solution 3 - JavaMahmudul Hasan ShohagView Answer on Stackoverflow
Solution 4 - JavaiamVishal16View Answer on Stackoverflow
Solution 5 - JavaAli AkramView Answer on Stackoverflow
Solution 6 - JavaSergio Giscar DoleffoView Answer on Stackoverflow
Solution 7 - JavaMarium JawedView Answer on Stackoverflow
Solution 8 - JavaPGMacDesignView Answer on Stackoverflow
Solution 9 - JavaQDiamondView Answer on Stackoverflow
Solution 10 - JavaabhinavDAIICTView Answer on Stackoverflow
Solution 11 - Javajadar_mView Answer on Stackoverflow
Solution 12 - JavaIslam AlshnaweyView Answer on Stackoverflow