【问题标题】:java.lang.RuntimeException: Could not deserialize object. Failed to convert value of type java.lang.Long to booleanjava.lang.RuntimeException:无法反序列化对象。无法将 java.lang.Long 类型的值转换为布尔值
【发布时间】:2020-05-29 17:10:04
【问题描述】:

我有大问题。使用 Android Emulator 运行应用程序效果很好,但是当我将应用程序放在真机上时出现此错误:

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

我的 Firebase 数据正常,“imp”字段是数据库中的布尔值,所以我检索的是来自数据库的布尔值并将其存储在布尔变量中。当数据从 Firebase 作为布尔值发送时,怎么能说我收到了 Long 呢?

为什么只有真机才会出现这种情况

现在我真的不明白为什么在 Android Emulator 中可以正常工作,而在真实手机中安装应用程序会给我这个错误。

这是我正在处理数据的适配器:

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)

【问题讨论】:

  • 展示你的 lgocat。

标签: java android firebase firebase-realtime-database


【解决方案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 值。

【讨论】:

  • 我的 firebase 数据以某种方式损坏了。删除文档并创建新文档解决了它。
  • 嗨,Alex,出于某种原因,我想在数据损坏时显示一些默认值。我不希望我的应用程序崩溃。我只是不知道我应该在哪里捕获这个异常?
  • @Bikash 我建议您发布另一个新问题,以便我或其他用户可以帮助您。
  • 当然@AlexMamo。请找到我的问题的链接stackoverflow.com/questions/53849305/…
【解决方案2】:

检查你的数据库,如果你的数据类型是准确的,那么按照这两种方法。正如你所说的这个问题只发生在真实的设备上,所以数据类型没有问题,它是准确的。

我遇到了同样的问题,这个问题可以通过两种方法解决:

1.删除整个集合,然后重新添加数据。我试过这个,但我不推荐这种方法,因为添加数据需要付出很多努力,尤其是在处理大量数据时。

2.卸载应用程序,然后重新安装。如果您尝试了第一种方法,但没有帮助,这肯定会起作用。这是两种方法中最简单的方法,不需要太多努力。

对我来说,第二种方法有效,但对某些人来说,第一种方法可能有效。 使用第二种方法。它很简单,不需要太多的努力。

【讨论】:

    【解决方案3】:

    这不是一个大问题,您只是想获得错误的投射类型。 转到您的数据库并检查所有记录中的imp property。当然,您为此错误地输入了错误的数据类型。

    它应该是布尔类型,但在您的一条记录中输入错误。

    您还应该在此映射周围添加 try catch 块。

    try{
        modelNoutati newsInt = doc.getDocument().toObject(modelNoutati.class);
                        newsL.add(newsInt);
    
                        newsAdaptor.notifyDataSetChanged();
    }catch(Exception e){
              e.printStackTrace();
    }
    

    【讨论】:

    • 没有错误的条目。刚刚检查...这就是为什么我不明白。(我只有 4 个文档)。我检查了 10 多次,相信我
    • 问题是在模拟器中工作正常——这就是为什么我告诉你我的条目是好的。在手机上安装它时,它给了我这个错误。在模拟器上运行应用程序时不应该给我错误吗? String(firebase)-String(app var) 表示 firebase 字符串是 Long,Boolean 到 Boolean 表示 olso 是字符串,但仅在真实设备上!为什么?
    • 显示你的数据库好友,因为今天早上我遇到了这个问题,我只做两件事来解决这个错误,创建一个无 argus 构造函数并检查数据库的数据类型。
    【解决方案4】:

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

    【讨论】:

    • 如果我这样做,它会给我这个错误.. java.lang.RuntimeException:无法反序列化对象。无法将 java.lang.String 类型的值转换为 int(在字段 'imp' 中找到)......这是正常的 - 不同的条目提示
    • int imp = Integer.parseInt(_imp); //_imp getting from database
    猜你喜欢
    • 1970-01-01
    • 2018-09-29
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多