[Android]Parcelable encountered IOException writing serializable object (name = xxx)
阿新 • • 發佈:2018-12-26
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)