android - Parcelable 写序列化对象遇到IOException [QUICKBLOX DIALOG]

标签 android serialization quickblox quickblox-android

自 4 月 15 日以来,我在 quickblox 中遇到了一个问题,当时 Quickblox 将 SDK for android 更新到 2.5.2。 我注意到的问题是,如果我为对话框填充了 customData 参数,那么它会抛出下面提到的 IOExeption。否则没有问题。

不会引起任何问题的对话框。

QBDialog{id=xxxx, created_at=2016-19-04 11:36:54, last_msg_user_id=xxxx, occupants_ids=[xxxx, xxxx, last_message=hey, last_message_date_sent=1461046124, type=PRIVATE, name=xxxx, room_jid=null, user_id=xxxx, photo=null, unread_message_count=0, customData=null}

导致崩溃的对话框。

QBDialog{id=xxxx, created_at=2016-19-04 12:01:00, last_msg_user_id=xxxx, occupants_ids=[xxxx, xxxx], last_message=hello, last_message_date_sent=1461047494, type=PRIVATE, name=xxxx, room_jid=null, user_id=xxxx, photo=null, unread_message_count=1, customData=QBBaseCustomObject{className='DialogueRelationState', fields={isFriends=true, location_field=null}}}

将上述对话传递给 Activity_chat 类的代码段

Bundle bundle = new Bundle();
bundle.getString(selectedDialog.toString());
bundle.putSerializable(Activity_Chat.EXTRA_DIALOG, selectedDialog);
Activity_Chat.start(DrawActivity_Chatlist.this, bundle);// error points here

接收Activity的启动方法

public static void start(Context context, Bundle bundle) {

    Intent intent = new Intent(context, Activity_Chat.class);
    intent.putExtras(bundle);
    context.startActivity(intent); //error points here
}

错误日志:

Fatal Exception: java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.quickblox.chat.model.QBDialog)
       at android.os.Parcel.writeSerializable(Parcel.java:1323)
       at android.os.Parcel.writeValue(Parcel.java:1271)
       at android.os.Parcel.writeArrayMapInternal(Parcel.java:618)
       at android.os.Bundle.writeToParcel(Bundle.java:1692)
       at android.os.Parcel.writeBundle(Parcel.java:643)
       at android.content.Intent.writeToParcel(Intent.java:7152)
       at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2663)
       at android.app.Instrumentation.execStartActivity(Instrumentation.java:1419)
       at android.app.Activity.startActivityForResult(Activity.java:3532)
       at android.app.Activity.startActivityForResult(Activity.java:3458)
       at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:784)
       at android.app.Activity.startActivity(Activity.java:3780)
       at android.app.Activity.startActivity(Activity.java:3748)
       at com.social.fitspur.activities.Activity_Chat.start(Activity_Chat.java:100)
       at com.social.fitspur.activities.DrawActivity_Chatlist$3.onItemClick(DrawActivity_Chatlist.java:198)
       at android.widget.AdapterView.performItemClick(AdapterView.java:299)
       at android.widget.AbsListView.performItemClick(AbsListView.java:1162)
       at android.widget.AbsListView$PerformClick.run(AbsListView.java:2953)
       at android.widget.AbsListView$3.run(AbsListView.java:3708)
       at android.os.Handler.handleCallback(Handler.java:733)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:149)
       at android.app.ActivityThread.main(ActivityThread.java:5257)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
       at dalvik.system.NativeStart.main(NativeStart.java)
Caused by java.io.NotSerializableException: org.json.JSONObject$1
       at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1366)
       at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1673)
       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1519)
       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1483)
       at java.util.HashMap.writeObject(HashMap.java:995)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1055)
       at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1406)
       at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1673)
       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1519)
       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1483)
       at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:981)
       at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
       at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1076)
       at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1406)
       at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1673)
       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1519)
       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1483)
       at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:981)
       at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368)
       at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1076)
       at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1406)
       at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1673)
       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1519)
       at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1483)
       at android.os.Parcel.writeSerializable(Parcel.java:1318)
       at android.os.Parcel.writeValue(Parcel.java:1271)
       at android.os.Parcel.writeArrayMapInternal(Parcel.java:618)
       at android.os.Bundle.writeToParcel(Bundle.java:1692)
       at android.os.Parcel.writeBundle(Parcel.java:643)
       at android.content.Intent.writeToParcel(Intent.java:7152)
       at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2663)
       at android.app.Instrumentation.execStartActivity(Instrumentation.java:1419)
       at android.app.Activity.startActivityForResult(Activity.java:3532)
       at android.app.Activity.startActivityForResult(Activity.java:3458)
       at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:784)
       at android.app.Activity.startActivity(Activity.java:3780)
       at android.app.Activity.startActivity(Activity.java:3748)
       at com.social.fitspur.activities.Activity_Chat.start(Activity_Chat.java:100)
       at com.social.fitspur.activities.DrawActivity_Chatlist$3.onItemClick(DrawActivity_Chatlist.java:198)
       at android.widget.AdapterView.performItemClick(AdapterView.java:299)
       at android.widget.AbsListView.performItemClick(AbsListView.java:1162)
       at android.widget.AbsListView$PerformClick.run(AbsListView.java:2953)
       at android.widget.AbsListView$3.run(AbsListView.java:3708)
       at android.os.Handler.handleCallback(Handler.java:733)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:149)
       at android.app.ActivityThread.main(ActivityThread.java:5257)
       at java.lang.reflect.Method.invokeNative(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:515)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
       at dalvik.system.NativeStart.main(NativeStart.java)

据我了解,它在对话框中遇到了不可序列化的 JSON,因此出现了错误。

注意:这在 4 月 15 日之前工作正常,我也没有对我的自定义类进行任何更改

我试过将SDK版本从v2.5升级到v2.5.2,但是没有用。

最佳答案

QuickBlox 最近添加了一个 location_field,它返回一个 jsonObject 但期望的是字符串。最后在获取对话框时添加这一行就成功了。

for (QBDialog dialog : dialogs) {
    QBDialogCustomData customData = dialog.getCustomData();
    usersIDs.addAll(dialog.getOccupants());
    if (customData == null) {
        continue;
    }
    HashMap<String, Object> fields = customData.getFields();
    if (!fields.isEmpty()) {
        fields.put("location_field", null);
    }
}

关于android - Parcelable 写序列化对象遇到IOException [QUICKBLOX DIALOG],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36834145/

相关文章:

java - 如何在文件中写入非序列化对象(例如形状)以便稍后读取

ios - 如何快速从 quickblox 获取发件人个人资料图片?

android - 如何将 MultiAutoCompleteTextView 中的结果设置为来自 Web 源而不是静态或数据库结果?

java - 如何将字符串从 Java (Android) 导出到 MS Word

java - 通过带 header 的 HTTPPOST Android JSON 调用

ios - Quickblox 阻止/禁止像 Facebook 这样的联系人

ios - 如何在 Quickblox IOS 中更新已发送的消息

android - 在 Activity 和 ViewModel 之间传递数据

java - JSON - 使用 Gson 反序列化客户端类

Java - ImageIcon序列化问题(游戏的最后部分)