1. 程式人生 > >Parcelable encountered IOException writing serializable object 解決方法

Parcelable encountered IOException writing serializable object 解決方法

在往bundle中寫資料時報以下錯誤:

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object

有一個類A,繼承自Serializable,A有個物件a,A有個成員變數b,b的型別是OptionsButton。

public static abstract class OptionsButton implements Serializable {

        // 圖示drawable id
        public int iconId;

        // 響應事件
        public abstract void onClick(Context context, View view, String sessionId);
    }

錯誤發生自把a往bundle中put的時候。

發現在類靜態方法中new OptionsButton並實現onClick的時候,不會報錯;而在類成員方法中new OptionsButton則會報上面錯誤,程式碼如下:

a.b = new SessionCustomization.OptionsButton() {
            @Override
            public void onClick(Context context, View view, String sessionId) {
                MessageInfoActivity.startActivity(context, sessionId); //開啟聊天資訊
            }
        };

執行這兩段程式碼的外部類沒有繼承自Serializable。

結論:

在類成員方法中直接new class並實現方法相當於宣告非靜態內部類並實現響應的方法,會攜帶當前物件的引用。

因為外部類沒有整合自Serializable,在執行Bundle.putExtra時,因為變數b,整個物件會被當作Parcel型別的物件,導致與Serializable不匹配。