EulerVen
EulerVen

Reputation: 1113

Firebase No properties to serialize found on class

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?

Upvotes: 101

Views: 58532

Answers (12)

Islam Alshnawey
Islam Alshnawey

Reputation: 852

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.** {
  *;
}

Upvotes: 0

Sergio Giscar Doleffo
Sergio Giscar Doleffo

Reputation: 21

Verify this:

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

Upvotes: 2

Ali Akram
Ali Akram

Reputation: 5317

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 :)

Upvotes: 4

jadar_m
jadar_m

Reputation: 37

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

Upvotes: 0

Abhinav Tripathi
Abhinav Tripathi

Reputation: 178

You can do either of the two things -

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

Upvotes: 0

QDiamond
QDiamond

Reputation: 1

adding

@ServerTimeStamp
public Date date; 

helped me to resolve the issue

Upvotes: 0

PGMacDesign
PGMacDesign

Reputation: 6302

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.

Upvotes: 0

Marium Jawed
Marium Jawed

Reputation: 419

Declare variables as public.

public String email

Upvotes: 0

iamVishal16
iamVishal16

Reputation: 1780

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.

Upvotes: 3

Mahmudul Hasan Shohag
Mahmudul Hasan Shohag

Reputation: 3131

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

Upvotes: 35

aselims
aselims

Reputation: 1893

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

Upvotes: 125

Shubhank
Shubhank

Reputation: 21805

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;

Upvotes: 188

Related Questions