类上没有要序列化的属性

我无法创建一个 Firebase 数据库。

我试图建立一个类,一个非常简单的类:

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

类似于 Firebase 中的一个示例类。

从 getUser ()获得的应用程序用户已经登录 Firebase。

当我调用 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) ;

一个致命的异常出现了。

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)

我检查过了,都通过了,怎么了?

52134 次浏览

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;

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

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

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.

Declare variables as public.

public String email

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.

adding

@ServerTimeStamp
public Date date;

helped me to resolve the issue

You can do either of the two things -

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

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

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

Verify this:

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

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