Parcelable遇到IOException,编写可序列化对象[QUICKBLOX DIALOG]

时间:2016-04-25 07:14:43

标签: 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 =嘿,   last_message_date_sent = 1461046124,type = PRIVATE,name = xxxx,   room_jid = null,user_id = xxxx,photo = null,unread_message_count = 0,   =的CustomData空}

导致崩溃的对话框。

  

QBDialog {id = xxxx,created_at = 2016-19-04 12:01:00,   last_msg_user_id = xxxx,occupants_ids = [xxxx,xxxx],last_message =你好,   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&#39 ;,   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

启动接收活动的方法

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)

我从中理解的是,它在Dialog中遇到了一些不可序列化的东西,因此也就是错误。

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

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

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

我的解决方案是简单的日期格式:

 public static void setGroupDialog(QBDialog qbDialog) {
    GsonBuilder builder = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() {
        @Override
        public boolean shouldSkipField(FieldAttributes f) {
            return f.getName().equals("sdf");
        }

        @Override
        public boolean shouldSkipClass(Class<?> clazz) {
            return false;
        }
    });
    String json = builder.create().toJson(qbDialog);
    getAuthPreferences(YOUR_APP_CONTEXT).edit()
            .putString(PREF_GROUP_DIALOG, json).commit();
}

答案 2 :(得分:0)

我面临同样的问题。相反,现在我的整个项目都受到这个问题的影响。所以目前我正在使用这种技术并不好,但我们可以使用,后者在更新SDK时我们可以在几秒钟内恢复我们的更改。我所有依赖于QBDialog的类现在都崩溃了。所以现在我和你分享我的一个类代码块。这可能对你有所帮助。

崩溃代码:

public class ChattingActivity extends ... {


    public static final void start(Context context, QBDialog qbDialog)
    {
            Intent intent = new Intent(context,ChattingActivity.class);
            intent.putExtra(Intent.EXTRA_STREAM, qbDialog); 
            context.startActivity(intent); // Crash when try to start
    }
}

稳定的代码:

public class ChattingActivity extends ... {

    private static QBDialog QB_DIALOG;

    public static final void start(Context context, QBDialog qbDialog)
    {
            Intent intent = new Intent(context,ChattingActivity.class);
        //  intent.putExtra(Intent.EXTRA_STREAM, qbDialog);
            ChattingActivity.QB_DIALOG = qbDialog;
            context.startActivity(intent); // Crash when try to start
    }

    // Important: Should do null in OnDestroy.
        @Override
    protected void onDestroy() {
      super.onDestroy();
      QB_DIALOG = null;
    }


}