source

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

factcode 2022. 9. 12. 11:34
반응형

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)

타입을 확인했는데 모두 승인되었습니다.뭐가 잘못됐나요?

파이어베이스에서는 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에는 getters 및/또는 (옵션) setters가 있는 필드만 있기 때문에 많은 최적화가 이루어지지 않으므로 "@Keep"라는 주석을 사용하여 proguard가 이 클래스에서 메서드를 삭제하지 않도록 할 수 있습니다.

자세한 것은, https://developer.android.com/studio/build/shrink-code.html 를 참조해 주세요.

@Keep
public class Store {}

내 경우 모델 클래스를 유지하기 위해 프로가드 규칙을 추가하는 것을 잊었습니다.

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

이것은 @aselims의 답변과 같습니다.프로가드 버전일 뿐입니다.

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

이제 오류 없이 완벽하게 작동합니다.신입사원들에게 도움이 되었으면 좋겠다.

솔루션

이 경우는 릴리스/서명모드 APK에서만 문제가 발생하였습니다.그래서 나는 이 단계들을 통해 고쳤다.

1- 모든 모델 클래스를 다음과 같은 규칙에 추가

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

또는

@Keep
public class modelClass {}

2- 모델 클래스의 모든 변수를 다음과 같이 선언함private

3 - 경합하는 키를 삭제했다.

냉각제 :)

이것을 확인합니다.

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

변수를 public으로 선언합니다.

public String email

이 문제에 부딪혀도 위의 솔루션이 모두 작동하지 않는 경우 선언된 변수도 다음과 같아야 합니다.Objectraw type이 아닌 type을 입력합니다.

를 들어,Integer는 사용할 수 없습니다.int

에 대해서도 마찬가지입니다.boolean,float,double, 등 기본적으로 모든 유형의 언박스입니다.

추가

@ServerTimeStamp
public Date date; 

문제를 해결하는 데 도움이 되었다

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

  1. 변수를 공개하거나
  2. 모든 변수에 대한 getter 및 setter 추가

아래에 기술된 문제를 해결하려면 클래스를 Serialable로 선언해야 합니다.또, 코드의 경우는, 다음과 같습니다.

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

이 솔루션을 사용해 보세요!

1-시리얼화 가능한 인터페이스 구현

class model implements Serializable {}

2- 컨스트럭터 및 퍼블릭세터 및 게터 메서드를 사용하는 프라이빗 속성을 가진 클래스 모델

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 - 코드를 Proguard 규칙에 추가합니다.

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

언급URL : https://stackoverflow.com/questions/37743661/firebase-no-properties-to-serialize-found-on-class

반응형