[英]Firebase No properties to serialize found on class
我正在创建一个 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
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 不会从此类中删除任何方法。
查看更多信息: 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;
}
现在它完美地工作,没有任何错误。 希望对新手开发者有所帮助。
解决方案
在我的情况下,问题仅在发布/签名模式 APK 中。 所以我通过执行这些步骤来修复..
1- 将所有模型类添加到 proguaed 规则中,例如
-keep class com.YOUR_PACKAGE_NAME.modelClass.** { *; }
或者
@Keep
public class modelClass {}
2- 将模型类的所有变量声明为private
3- 删除了冲突的键
清凉丸 :)
将变量声明为公共变量。
public String email
如果有人遇到这种情况并且上述解决方案都不起作用,则声明的变量也需要是Object
类型而不是原始类型。
例如,您可以使用Integer
,但不能使用int
。
对于boolean
、 float
、 double
等也是如此。基本上,任何未装箱的类型。
添加
@ServerTimeStamp
public Date date;
帮我解决了这个问题
你可以做两件事中的任何一件——
要解决下面提到的问题,您应该将类声明为 Serializable 和代码:
`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
}
}`
验证这一点:
buildTypes {
release {
minifyEnabled false
...
}
debug {
minifyEnabled false
...
}
}
试试这个解决方案!
1-实现可序列化接口
class model implements Serializable {}
2- 具有私有属性的类模型,具有构造函数和公共 setter 和 getter 方法
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;
}
}
在Proguard的规则说的3-添加此代码在这里
# 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.** {
*;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.