Firebase 클래스에 직렬화 할 속성이 없습니다.


90

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)

유형을 확인했으며 모두 허용됩니다. 뭐가 문제 야?

답변:


172

Firebase는 Pojo에 공개 변수 또는 getter / setter 가 있어야합니다 .

변수 선언을 공용으로 변경

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
논리적으로 보인다. 아직 getter / setter를 정의하지 않았으며 일반적으로 POJO 변수를 private으로 정의합니다. 감사합니다!
EulerVen 2011 년

13
문서 예제에서도 'FriendlyMessage'와 같은 firebase 데이터베이스의 클래스에 개인 변수가 사용되었음을 발견했습니다. 내 디버그 APK에서는 작동했지만 릴리스 APK에서는 작동하지 않았습니다. 모든 것을 공용으로 변경 (및 기본 애플리케이션 외부에서 클래스 선언)하여 수정했습니다. Android에서는 항상 함정이 거의 없습니다.
Androidcoder

1
공개적으로 사용하는 것이 합리적입니다. Lol 내가 그것을 잊지 말았어야했다
Bharat

데 모든 것을 공개는 두 번째 댓글이 지적했듯이, 나는 또한 기본 응용 프로그램 외부에서 자신의 파일에 데이터 클래스를 가질 필요가 충분하지 않았다
마수드 elsad

고마워요 ... 이것으로 제 문제가 해결되었습니다. 그러나 나는 무언가를 알고 싶다. 처음에는 변수가 private 패키지로 선언되었지만 문제가되지 않았습니다. 하지만 APK를 만들고 물리적 장치에 설치했을 때 그 문제에 직면했습니다. 왜 ?
Sudipta Basak

99

Proguard를 사용하는 경우 구성에 따라 모델의 일부 방법이 제거 될 수 있습니다. getter 및 / 또는 (선택적으로) setter가있는 필드 만 있으므로 POJO에 대한 최적화가 많지 않다는 것을 알고 있으므로 "@Keep"주석을 사용하여 proguard가이 클래스에서 메서드를 삭제하지 않도록 할 수 있습니다.

자세한 정보는 https://developer.android.com/studio/build/shrink-code.html 을 확인하십시오.

@Keep
public class Store {}

2
당신은 생명의 은인 형제입니다. 서명 된 apk 후에 실제로 작동합니다.
Smeet

이것은 마침내 파이어베이스 데이터베이스와 함께 작동하는 앱의 '출시'버전을 만드는 이틀간의 시련과 투쟁을 해결했습니다. 디버그는 제대로 작동했지만 릴리스는 작동하지 않았습니다. Proguard를 의심 할 수있는 힌트를 주었어야했지만 어떻게 든 그렇게하지 못했습니다. 답변을 게시 해 주셔서 감사합니다!
Wahib Ul Haq

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

27

제 경우에는 모델 클래스를 유지하기 위해 proguard 규칙을 추가하는 것을 잊었습니다.

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

이것은 @aselims의 답변과 동일하며 proguard 버전입니다.

공식 firestore 예에서 찾았습니다.

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


proguard로 apk를 만든 후에도 동일한 문제가 발생했습니다.
Himanshu Shekher Jha

3

오늘이 문제가 발생했으며 개인 변수에 대한 getter / setter를 제공하여 해결했습니다.

전의:

private String pid;

public String getPid() {
    return pid;
}

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

이제 오류없이 완벽하게 작동합니다. 초보자 개발자에게 도움이되기를 바랍니다.



0

누군가이 문제를 겪고 위의 솔루션 중 어느 것도 작동하지 않는 경우 선언 된 변수도 Object원시 유형이 아닌 유형 이어야 합니다.

예를 들어, 당신은 할 수 사용 Integer의하지만 당신은 할 수 없습니다 사용int '들.

동일은 마찬가지입니다 boolean, float, double, 등 기본적으로, 어떤 언 박싱 유형입니다.



0

두 가지 중 하나를 수행 할 수 있습니다.

  1. 변수를 공개하거나
  2. 모든 변수에 대한 getter 및 setter 추가
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.