java.lang.RuntimeException:无法反序列化对象。无法将java.lang.Long类型的值转换为boolean

时间:2018-04-02 16:10:04

标签: java android firebase firebase-realtime-database

我有很大的问题。使用Android模拟器运行应用程序效果很好,但是当我将应用程序放在真正的手机上时,我收到此错误:

java.lang.RuntimeException: Could not deserialize object. Failed to convert value of type java.lang.Long to boolean (found in field 'imp')

我的Firebase数据没问题,' imp' field是数据库中的布尔值,因此我检索的是来自数据库的布尔值并将其存储在布尔值var中。当数据作为布尔值从Firebase发送时,怎么能说我收到Long?

为什么这只发生在真正的手机上?

现在我真的不明白为什么在Android模拟器中工作正常并在真实手机中安装应用程序会给我这个错误。

这是我正在处理数据的adapptor:

public class modelNoutati  {

String name;
String cont;
Date data;
Boolean imp;

public modelNoutati(){ }

public modelNoutati(String cont, Date data, Boolean imp, String name) {
    this.name = name;
    this.cont = cont;
    this.data = data;
    this.imp = imp;
}


public String getName() {return name;}

public void setName(String name) {this.name = name;}

public Date getData() {return data;}

public void setData(Date data) {this.data = data;}

public String getCont() {return cont;}

public void setCont (String cont) {this.cont = cont; }

public Boolean getImp () {return imp;}

public void setImp (Boolean imp) {this.imp = imp;}

我在 doc.getDocument()。toObject(modelNoutati.class)

上得到了这个问题
for (DocumentChange doc : documentSnapshots.getDocumentChanges()){

                if(doc.getType() == DocumentChange.Type.ADDED) {

                    modelNoutati newsInt = doc.getDocument().toObject(modelNoutati.class);
                    newsL.add(newsInt);

                    newsAdaptor.notifyDataSetChanged();

logcat的:

Process: projects.nv.umcstudent, PID: 14354
java.lang.RuntimeException: Could not deserialize object. Failed to convert value of type java.lang.Long to boolean (found in field 'imp')
    at com.google.android.gms.internal.zzeym.zzc(Unknown Source)
    at com.google.android.gms.internal.zzeym.zza(Unknown Source)
    at com.google.android.gms.internal.zzeym.zzb(Unknown Source)
    at com.google.android.gms.internal.zzeym.zza(Unknown Source)
    at com.google.android.gms.internal.zzeym$zza.zza(Unknown Source)
    at com.google.android.gms.internal.zzeym.zza(Unknown Source)
    at com.google.android.gms.internal.zzeym.zza(Unknown Source)
    at com.google.firebase.firestore.DocumentSnapshot.toObject(Unknown Source)
    at com.google.firebase.firestore.QueryDocumentSnapshot.toObject(Unknown Source)
    at projects.nv.umcstudent.News$1.onEvent(News.java:70)
    at projects.nv.umcstudent.News$1.onEvent(News.java:57)
    at com.google.firebase.firestore.zzi.onEvent(Unknown Source)
    at com.google.android.gms.internal.zzeyn.zza(Unknown Source)
    at com.google.android.gms.internal.zzeyo.run(Unknown Source)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6692)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

4 个答案:

答案 0 :(得分:1)

以下代码行:

java.lang.RuntimeException: Could not deserialize object. Failed to convert value of type java.lang.Long to boolean (found in field 'imp')

告诉你究竟是什么问题。您的imp属性在模型类中声明为Boolean,但是当您尝试从数据库中获取此属性的值时,您将获得Long。在Java中,您无法将Long转换为Boolean

要解决此问题,您需要清除数据库并添加新的数据,其中imp属性将保留Boolean值,就像在模型类中一样,而不是Long

BAFTA! ;)

答案 1 :(得分:1)

检查您的数据库,如果您的数据类型正确,请遵循以下两种方法。正如您所说的,此问题仅在真实设备上发生,因此数据类型没有问题,这是准确的。

我也面临同样的问题,可以通过两种方法解决此问题:

1。删除整个集合,然后再次添加数据。我尝试过这种方法,但我不推荐这种方法,因为添加数据需要很多工作,尤其是在处理大量数据时。

2。卸载该应用程序,然后重新安装它。如果您尝试了第一种方法,但对它没有帮助,则肯定可以。这是两种方法中最简单的一种,不需要那么多精力。

对我来说,第二种方法行得通,但有些方法可能行得通。 使用第二种方法。这很容易,不需要太多的努力。

答案 2 :(得分:0)

这不是一个大问题,你只是试图得到错误的铸造类型。 转到您的数据库并检查所有记录中的imp 属性。当然,您错误地为此输入了错误的数据类型。

它应该是布尔类型,但是在你的一个记录中,错误地输入了它。

你还应该在这个映射周围添加try catch块。

try{
    modelNoutati newsInt = doc.getDocument().toObject(modelNoutati.class);
                    newsL.add(newsInt);

                    newsAdaptor.notifyDataSetChanged();
}catch(Exception e){
          e.printStackTrace();
}

答案 3 :(得分:0)

在类int中将imp声明为modelNoutati,并在类数据库处理程序中将其声明为String。你的imp等于0(false)或1(true)。 我希望能帮到你:)。