Firebase在类上找不到要序列化的属性


86

我创建了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)

我已经检查过类型,并且都被接受。怎么了?

Answers:


165

Firebase要求您的Pojo具有公共变量或getter / setter。

将变量声明更改为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
这似乎是合乎逻辑的。我还没有定义getters / setter,通常我将POJO变量定义为private。谢谢!
EulerVen16年

13
即使在文档示例中,我也发现在诸如“ FriendlyMessage”之类的firebase数据库的类上使用了私有变量。我发现他们在调试apk上工作,但在发行apk上工作。将所有内容更改为公共(并在主应用程序外部声明该类)可以解决此问题。使用Android总是会遇到一些陷阱。
Androidcoder

1
将它们作为公共使用是有意义的。大声笑我不应该忘记这一点
巴拉特(Bharat)

公开所有内容还不够,我还需要在主应用程序之外的自己文件中拥有Data类,这是第二条评论所指出的
masood elsad

谢谢...这解决了我的问题。但是我想知道些什么。最初,该变量被声明为私有包,但这没有任何问题。但是,当我创建apk并将其安装在物理设备上时,我遇到了这个问题。为什么呢
Sudipta Basak

97

如果您使用的是Proguard,则可能会删除模型中的某些方法,具体取决于您的配置。我们知道POJO并没有太多优化,因为它只有带有getters和/或(可选)setters的字段,您可以使用注释“ @Keep”,因此proguard不会从此类中删除任何方法。

检查此以获取更多信息:https : //developer.android.com/studio/build/shrink-code.html

@Keep
public class Store {}

1
您是救命兄弟。签署apk后确实有效。
Smeet

最终,这解决了我为期2天的艰苦工作,以及使应用程序的“发布”版本与Firebase数据库一起工作的艰辛。调试工作正常,但发布却没有。它应该给了我一个怀疑Proguard的暗示,但是我却以某种方式未能做到这一点。非常感谢您发布答案!
瓦希卜·乌尔·哈克

当我在proguard-rules.pro文件中编写此代码时,出现以下错误:ProguardTokenType.CRLF, ProguardTokenType.FLAG_NAME , ProguardTokenType.LINE_CMT or ProguardTokenType.WS expected, got '@'
Shruti

要检查您的proguard规则是否正常工作,请在build / outputs / mapping / release / seeds.txt和build / outputs / mapping / release / usage.txt中检查输出,此处的更多信息developer.android.com/studio/build /shrink-code.html
Ninja420 '19


3

我今天遇到了这个问题,只需解决此问题即可为私有变量提供getter / setter。

例如:

private String pid;

public String getPid() {
    return pid;
}

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

现在,它可以完美工作,没有任何错误。希望它将对新手开发人员有所帮助。



0

万一遇到任何问题而上述解决方案都不起作用,则声明的变量也必须是Object类型而不是原始类型。

例如,您可以使用Integer,但不能使用int

同样是真实的booleanfloatdouble等,基本上任何拆箱类型。


0

@ServerTimeStamp
public Date date; 

帮助我解决了这个问题

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.