[java] Firebase 클래스에 직렬화 할 속성이 없습니다.
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)
유형을 확인했으며 모두 허용됩니다. 뭐가 문제 야?
답변
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;
답변
Proguard를 사용하는 경우 구성에 따라 모델의 일부 방법이 제거 될 수 있습니다. getter 및 / 또는 (선택적으로) setter가있는 필드 만 있으므로 POJO에 대한 최적화가 많지 않다는 것을 알고 있으므로 “@Keep”주석을 사용하여 proguard가이 클래스에서 메서드를 삭제하지 않도록 할 수 있습니다.
자세한 정보는 https://developer.android.com/studio/build/shrink-code.html 을 확인하십시오.
@Keep
public class Store {}
답변
제 경우에는 모델 클래스를 유지하기 위해 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
답변
오늘이 문제가 발생했으며 개인 변수에 대한 getter / setter를 제공하여 해결했습니다.
전의:
private String pid;
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
이제 오류없이 완벽하게 작동합니다. 초보자 개발자에게 도움이되기를 바랍니다.
답변
변수를 공용으로 선언하십시오.
public String email
답변
누군가이 문제를 겪고 위의 솔루션 중 어느 것도 작동하지 않는 경우 선언 된 변수도 Object
원시 유형이 아닌 유형 이어야 합니다.
예를 들어, 당신은 할 수 사용 Integer
의하지만 당신은 할 수 없습니다 사용int
‘들.
동일은 마찬가지입니다 boolean
, float
, double
, 등 기본적으로, 어떤 언 박싱 유형입니다.
답변
첨가
@ServerTimeStamp
public Date date;
문제를 해결하는 데 도움이