[Android]Parcelable encountered IOException writing serializable object (name = xxx)
Activity之间通过Intent传递值,支持基本数据类型和String对象及它们的数组对象byte、byte[]、char、char[]、boolean、boolean[]、short、short[]、int、int[]、long、long[]、float、float[]、double、double[]、String、String[],还有实现Serializable、Parcelable接口的类对象。
package com.example.test; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{ private Button btnSend; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnSend = (Button)findViewById(R.id.send); btnSend.setOnClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public void onClick(View v) { if(v.getId() == R.id.send){ Intent intent = new Intent(this, HomeActivity.class); Bundle bundle = new Bundle(); bundle.putString("Data", "hello......."); User user = new User(); user.setAge(11); user.setName("xiaosi"); bundle.putSerializable("User", user); intent.putExtras(bundle); startActivity(intent); } } }
package com.example.test; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.widget.TextView; public class HomeActivity extends Activity { private TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); Intent intent=getIntent(); Bundle bundle=intent.getExtras(); String str=bundle.getString("Data"); User user = (User) bundle.getSerializable("User"); text=(TextView)findViewById(R.id.text); text.setText(str+"姓名:"+user.getName()+"年龄:"+user.getAge()); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.home, menu); return true; } }
所以说activity之间传递自定义数据,只能实现implements Serializable或者Parcelable接口。
可以用bundle putSerializable(String,Serizlizable)数据或者直接用intent putExtrr(String,Serizlizable)数据。我有一个需求需要传递多个自定义类型数据,于是我写了一个对象把我需要的那些自定义数据封装了起来,这个类实现了Serizlizable接口。但是在putExtra的时候出现了错误。
后来我发现要想在Activity之间传递数据必须所有的内容都实现serializable接口才行,而我的对象中封装的一个自定义类型数据没有实现这个接口,所以出现了错误。
之后我让那个自定义类型实现了serializable接口就没有问题了。
我自定义了一个TransmitData对象,实现了serializable接口。
package com.sjf.model; import java.io.Serializable; import java.util.Date; /** * 传输的对象,直接通过Socket传输的最大对象 * @author XIAOSI * */ public class TransmitData implements Serializable{ /** * */ private static final long serialVersionUID = 1L; //发送的消息类型 private TransmitType type; // 来自哪个用户 private String fromUser; // 发往哪个用户 private String toUser; // 传输的内容 private User user; // 请求结果 private boolean isSucess; // 请求说明,反馈说明 private String description; // 请求或者反馈时间 private Date time; public Date getTime() { return time; } public void setTime(Date time) { this.time = time; } public boolean isSucess() { return isSucess; } public void setSucess(boolean isSucess) { this.isSucess = isSucess; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public TransmitType getType() { return type; } public void setType(TransmitType type) { this.type = type; } public String getFromUser() { return fromUser; } public void setFromUser(String fromUser) { this.fromUser = fromUser; } public String getToUser() { return toUser; } public void setToUser(String toUser) { this.toUser = toUser; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
然而TransmitData对象中自定义数据类型User并没有实现序列化接口。
就报错出:Parcelable encountered IOException writing serializable object (name = xxx)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。