Parcelable 在写入可序列化对象时遇到 IOException - startActivity
Parcelable encountered IOException writing serializable object - startActivity
我正在尝试创建一个注册系统。我在第一个 activity 中声明了一个 Profile 实例,然后我使用同一个实例传递给另一个 activity。我已经将同一个对象传递给其他活动 4 次以上,但有一个会出现此错误。
Class 通话:
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
newUser.setProfilePic(pic);
Intent itt = new Intent(Register20.this, Register30.class);
Bundle bd = new Bundle();
bd.putSerializable("newUser", newUser);
itt.putExtras(bd);
startActivity(itt);
Register20.this.finish();
}
});
Class 收到:
public class Register30 extends AppCompatActivity {
Profile newUser = new Profile();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register30);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
newUser = (Profile)getIntent().getSerializableExtra("newUser");
}
}
我的自定义对象class(我没有放置 getter 和 setter 以免变得太大):
public class Profile implements Serializable{
private String name;
private Integer age;
private String sex;
private String description;
private Calendar dateOfBirth;
private String password;
private String emailRegistration;
private int numberCellRegistration;
private ArrayList<Profile> friends = new ArrayList<>();
private ArrayList<Like> likes = new ArrayList<>();
private ImageView profilePic;
}
异常:
FATAL EXCEPTION: main
Process: com.chest.chestbrasil.chest, PID: 8880
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.chest.chestbrasil.chest.Profile)
at android.os.Parcel.writeSerializable(Parcel.java:1468)
at android.os.Parcel.writeValue(Parcel.java:1416)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:686)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1330)
at android.os.Bundle.writeToParcel(Bundle.java:1079)
at android.os.Parcel.writeBundle(Parcel.java:711)
at android.content.Intent.writeToParcel(Intent.java:7804)
at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2677)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1574)
at android.app.Activity.startActivityForResult(Activity.java:3921)
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
at android.app.Activity.startActivityForResult(Activity.java:3881)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
at android.app.Activity.startActivity(Activity.java:4208)
at android.app.Activity.startActivity(Activity.java:4176)
at com.chest.chestbrasil.chest.Register20.onClick(Register20.java:73)
at android.view.View.performClick(View.java:5201)
at android.view.View$PerformClick.run(View.java:21163)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Caused by: java.io.NotSerializableException: android.support.v7.widget.AppCompatImageView
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360)
at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054)
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
at android.os.Parcel.writeSerializable(Parcel.java:1463)
at android.os.Parcel.writeValue(Parcel.java:1416)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:686)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1330)
at android.os.Bundle.writeToParcel(Bundle.java:1079)
at android.os.Parcel.writeBundle(Parcel.java:711)
at android.content.Intent.writeToParcel(Intent.java:7804)
at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2677)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1574)
at android.app.Activity.startActivityForResult(Activity.java:3921)
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
at android.app.Activity.startActivityForResult(Activity.java:3881)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
at android.app.Activity.startActivity(Activity.java:4208)
at android.app.Activity.startActivity(Activity.java:4176)
at com.chest.chestbrasil.chest.Register20.onClick(Register20.java:73)
at android.view.View.performClick(View.java:5201)
at android.view.View$PerformClick.run(View.java:21163)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
或者:
从 Profile
中删除 profilePic
,或
将其更改为某种可以跨进程边界传递且不太大的数据类型(例如,资源 ID),或
ImageView
无法跨进程边界传递,并且每个 startActivity()
调用都会将 Intent
从您的进程传递到核心 OS 进程(并且,在此案例,回到你的过程)。相反,传递一些可以告诉您如何在 Register30
Activity
.
中填充其他 ImageView
的内容
Caused by: java.io.NotSerializableException:
android.support.v7.widget.AppCompatImageView
ImageView 不可序列化。相反,您应该在模型上传递包含给定图像的 byteArray,并在 onCreate
方法上重新创建它。
我正在尝试创建一个注册系统。我在第一个 activity 中声明了一个 Profile 实例,然后我使用同一个实例传递给另一个 activity。我已经将同一个对象传递给其他活动 4 次以上,但有一个会出现此错误。
Class 通话:
btnNext.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
newUser.setProfilePic(pic);
Intent itt = new Intent(Register20.this, Register30.class);
Bundle bd = new Bundle();
bd.putSerializable("newUser", newUser);
itt.putExtras(bd);
startActivity(itt);
Register20.this.finish();
}
});
Class 收到:
public class Register30 extends AppCompatActivity {
Profile newUser = new Profile();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register30);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
newUser = (Profile)getIntent().getSerializableExtra("newUser");
}
}
我的自定义对象class(我没有放置 getter 和 setter 以免变得太大):
public class Profile implements Serializable{
private String name;
private Integer age;
private String sex;
private String description;
private Calendar dateOfBirth;
private String password;
private String emailRegistration;
private int numberCellRegistration;
private ArrayList<Profile> friends = new ArrayList<>();
private ArrayList<Like> likes = new ArrayList<>();
private ImageView profilePic;
}
异常:
FATAL EXCEPTION: main
Process: com.chest.chestbrasil.chest, PID: 8880
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.chest.chestbrasil.chest.Profile)
at android.os.Parcel.writeSerializable(Parcel.java:1468)
at android.os.Parcel.writeValue(Parcel.java:1416)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:686)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1330)
at android.os.Bundle.writeToParcel(Bundle.java:1079)
at android.os.Parcel.writeBundle(Parcel.java:711)
at android.content.Intent.writeToParcel(Intent.java:7804)
at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2677)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1574)
at android.app.Activity.startActivityForResult(Activity.java:3921)
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
at android.app.Activity.startActivityForResult(Activity.java:3881)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
at android.app.Activity.startActivity(Activity.java:4208)
at android.app.Activity.startActivity(Activity.java:4176)
at com.chest.chestbrasil.chest.Register20.onClick(Register20.java:73)
at android.view.View.performClick(View.java:5201)
at android.view.View$PerformClick.run(View.java:21163)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
Caused by: java.io.NotSerializableException: android.support.v7.widget.AppCompatImageView
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1344)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:959)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:360)
at java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.java:1054)
at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1384)
at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1651)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1497)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1461)
at android.os.Parcel.writeSerializable(Parcel.java:1463)
at android.os.Parcel.writeValue(Parcel.java:1416)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:686)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1330)
at android.os.Bundle.writeToParcel(Bundle.java:1079)
at android.os.Parcel.writeBundle(Parcel.java:711)
at android.content.Intent.writeToParcel(Intent.java:7804)
at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2677)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1574)
at android.app.Activity.startActivityForResult(Activity.java:3921)
at android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79)
at android.app.Activity.startActivityForResult(Activity.java:3881)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
at android.app.Activity.startActivity(Activity.java:4208)
at android.app.Activity.startActivity(Activity.java:4176)
at com.chest.chestbrasil.chest.Register20.onClick(Register20.java:73)
at android.view.View.performClick(View.java:5201)
at android.view.View$PerformClick.run(View.java:21163)
at android.os.Handler.handleCallback(Handler.java:746)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5443)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
或者:
从
Profile
中删除profilePic
,或将其更改为某种可以跨进程边界传递且不太大的数据类型(例如,资源 ID),或
ImageView
无法跨进程边界传递,并且每个 startActivity()
调用都会将 Intent
从您的进程传递到核心 OS 进程(并且,在此案例,回到你的过程)。相反,传递一些可以告诉您如何在 Register30
Activity
.
ImageView
的内容
Caused by: java.io.NotSerializableException: android.support.v7.widget.AppCompatImageView
ImageView 不可序列化。相反,您应该在模型上传递包含给定图像的 byteArray,并在 onCreate
方法上重新创建它。