Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在类上找不到要序列化的Firebase属性_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

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

Java 在类上找不到要序列化的Firebase属性,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在创建Firebase数据库 我正试着做一个班级的模型。一个非常简单的类: package com.glups.model; import com.google.firebase.database.IgnoreExtraProperties; @IgnoreExtraProperties public class AlumnoFB { private String nombre; private String apellidos; private String

我正在创建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)
06-10 10:17:37.179 13841-13841/com.glups.controlclases E/AndroidRuntime:FATAL EXCEPTION:main
进程:com.glups.controlclases,PID:13841 com.google.firebase.database.DatabaseException:在类com.glups.model.AlumnoFB上找不到要序列化的属性
在com.google.android.gms.internal.zzaix$zza(未知来源)
位于com.google.android.gms.internal.zzaix.zzj(未知来源)
位于com.google.android.gms.internal.zzaix.zzaw(未知来源)
在com.google.android.gms.internal.zzaix.zzav(未知来源)
位于com.google.firebase.database.DatabaseReference.zza(未知来源)
位于com.google.firebase.database.DatabaseReference.setValue(未知源)
位于com.glups.controlclases.MainActivity$4.onClick(MainActivity.java:305)
在android.view.view.performClick上(view.java:4780)
在android.view.view$PerformClick.run(view.java:19866)
位于android.os.Handler.handleCallback(Handler.java:739)
位于android.os.Handler.dispatchMessage(Handler.java:95)
位于android.os.Looper.loop(Looper.java:135)
位于android.app.ActivityThread.main(ActivityThread.java:5258)
位于java.lang.reflect.Method.invoke(本机方法)
位于java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

我已经检查了类型,所有的都被接受了。怎么了?

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;

如果您使用的是proguard,则模型中的某些方法可能会根据您的配置进行剥离。正如我们所知,POJO没有太多优化,因为它只有带有getter和/或(可选)setter的字段,您可以使用注释“@Keep”,这样proguard就不会从这个类中删除任何方法

查看此项了解更多信息:


在我的例子中,我忘记添加proguard规则来保留模型类:

-keep class com.google.firebase.example.fireeats.model.** { *; }
这与@aselims的答案相同,只是proguard版本

我在firestore官方示例中找到了它:


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

例:


现在它的工作完美无误。希望它能帮助新手开发人员。

将变量声明为公共变量

public String email

如果有人遇到这种情况,并且上述解决方案都不起作用,那么声明的变量也需要是
Object
类型,而不是原始类型

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

对于
boolean
float
double
等,情况也是如此。基本上,任何未装箱类型都是如此

添加

@ServerTimeStamp
public Date date; 

帮助我解决了这个问题

你可以做这两件事中的任何一件-

  • 公开你的变量 或
  • 为所有变量添加getter和setter

  • 要解决下面提到的问题,您应该将该类声明为可序列化的,并且针对代码:

    `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
    }
    }`
    
    解决方案

    在我的案例中,问题仅出现在发布/签名模式APK中。因此,我通过执行以下步骤进行了修复

    1-将所有模型类添加到程序化规则中,如

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

    2-将模型类的所有变量声明为
    private

    3-删除冲突密钥


    冷药丸:)

    这似乎是合乎逻辑的。我还没有定义getter/setter,我通常定义POJO变量private。它可以工作。非常感谢。甚至在文档示例中,我发现firebase数据库的类上使用了私有变量,如“FriendlyMessage”。我发现他们在我的调试apk上工作,而不是发布apk。将所有内容更改为public(并在主应用程序之外声明类)修复了它。安卓总是有一些小缺陷。把它们作为公共资源使用是有道理的。哈哈,我不应该忘记,仅仅将所有内容公开是不够的,我还需要将数据类放在主应用程序之外的自己的文件中,正如第二条评论所指出的,谢谢。。。这解决了我的问题。但是我想知道一些事情。起初,变量被声明为包私有,但这并没有造成任何问题。但当我创建apk并安装在物理设备上时,我遇到了这个问题。为什么?你是救命恩人,兄弟。在签署了apk之后,它真的很有效。这最终解决了我两天的痛苦和挣扎,让“发布”版本的应用程序与firebase数据库一起工作。调试工作正常,但发布版没有。它本应该给我一个怀疑Proguard的暗示,但不知为什么我没有这么做。非常感谢您发布答案!当我在proguard-rules.pro文件中编写此代码时,我得到了以下错误:
    ProguardTokenType.CRLF、ProguardTokenType.FLAG\u NAME、ProguardTokenType.LINE\u CMT或ProguardTokenType.WS预期,得到“@”
    以检查您的proguard规则是否正常工作,检查build/outputs/mapping/release/seeds.txt和build/outputs/mapping/release/usage.txt中的输出更多信息我在使用proguard创建apk后也遇到了同样的问题。
    `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
    }
    }`
    
    -keep class com.YOUR_PACKAGE_NAME.modelClass.** { *; }
    
    @Keep
    public class modelClass {}