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
이 문제에 부딪혀도 위의 솔루션이 모두 작동하지 않는 경우 선언된 변수도 다음과 같아야 합니다.Object
raw type이 아닌 type을 입력합니다.
예를 들어,Integer
는 사용할 수 없습니다.int
의
에 대해서도 마찬가지입니다.boolean
,float
,double
, 등 기본적으로 모든 유형의 언박스입니다.
추가
@ServerTimeStamp
public Date date;
문제를 해결하는 데 도움이 되었다
두 가지 중 하나를 수행할 수 있습니다.
- 변수를 공개하거나
- 모든 변수에 대한 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
'source' 카테고리의 다른 글
Java 8에서 기본 Zone Offset을 얻는 방법 (0) | 2022.09.12 |
---|---|
JavaScript에서 두 숫자 사이의 난수 생성 (0) | 2022.09.12 |
size of(my_arr)[0]이 컴파일되고 size of(my_arr[0])이 같은 이유는 무엇입니까? (0) | 2022.09.12 |
단일 Amazon RDS 인스턴스에 생성할 수 있는 데이터베이스 수 (0) | 2022.09.12 |
Node.js 및 Express를 사용하여 POST할 때 요청 본문에 액세스하는 방법 (0) | 2022.09.12 |