使用自定义对象时,在activites android之间传递数据时出错

时间:2015-06-10 07:33:35

标签: android object android-activity serializable

当我故意传递此对象时,它没有启动活动。

  

自定义对象代码

public class UserVo implements Serializable {

String name,id;
String can_reply,can_view;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getId() {
    return id;
}

public String getCan_reply() {
    return can_reply;
}

public void setCan_reply(String can_reply) {
    this.can_reply = can_reply;
}

public String getCan_view() {
    return can_view;
}

public void setCan_view(String can_view) {
    this.can_view = can_view;
}

public void setId(String id) {
    this.id = id;
}
  

通过意图发送数据

   intent.putExtra("UserVo",vo);
   intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
     startActivity(intent);
        finish();
  

接收数据

    intent=getIntent();
    UserVo vo= (UserVo) intent.getSerializableExtra("UserVo");

我也试过捆绑,但它仍然不起作用。

4 个答案:

答案 0 :(得分:2)

请看这个链接Serializable

  

为每个可序列化类分配一个名为serialVersionUID的版本标识符。默认情况下,此标识符是通过散列类声明及其成员来计算的。此标识符包含在序列化形式中,以便在反序列化期间可以检测到版本冲突。如果本地serialVersionUID与序列化数据中的serialVersionUID不同,则反序列化将因InvalidClassException而失败。

要避免它:

  

您可以通过声明显式serialVersionUID来避免此失败。声明显式serialVersionUID告诉序列化机制该类向前和向后兼容共享该serialVersionUID的所有版本。声明serialVersionUID如下所示:private static final long serialVersionUID = 0L;

并记住:

  

如果声明serialVersionUID,则每次类更改与先前版本不兼容时,都应增加它。通常,这是在您添加,更改或删除非瞬态字段时。

为了达到最佳效果,我建议您使用Parcelable。编码更难,但性能更好。

答案 1 :(得分:1)

如果出于某种原因,您无法将对象设为Parcelable,请尝试添加serialVersionUID。您可以通过IDE生成它或自己选择一个。

答案 2 :(得分:1)

对于UserVo,您将拥有

UserVo implements Parcelable {
...
...
public UserVo (){

 }      
 @Override public int describeContents() {
    return 0;
}

  @Override public void writeToParcel(Parcel dest, int flags) {

    dest.writeString(name);
    + other data ...writInt etc 

}

public void readFromParcel(Parcel source){
    name = source.readString();
    + other data ..keep the same order
}
public static final Parcelable.Creator<DocumentFile> CREATOR = new Parcelable.Creator<UserVo>() {

    @Override
    public UserVo createFromParcel(Parcel source) {
        return new UserVo(source);
    }

    @Override
    public UserVo[] newArray(int size) {
        return new UserVo[size];
    }
};
public UserVo(Parcel source )
{
    readFromParcel(source);
}

另外看看注释库,使用@Extra注释很容易发送数据。

答案 3 :(得分:0)

为了将自定义对象从一个Activity发送到Other,您必须使用serialVersionID序列化对象。请根据您的要求尝试以下修改过的代码。

<强> UserVo.java

public class UserVo implements Serializable {

private static final long serialVersionUID = 1L;

String name,id;
String can_reply,can_view;

public String getName() {
    return name;
} 

public void setName(String name) {
    this.name = name;
} 

public String getId() {
    return id;
} 

public String getCan_reply() {
    return can_reply;
} 

public void setCan_reply(String can_reply) {
    this.can_reply = can_reply;
} 

public String getCan_view() {
    return can_view;
} 

public void setCan_view(String can_view) {
    this.can_view = can_view;
} 

public void setId(String id) {
    this.id = id;
} 

ActivityA.java - 通过Intent

发送对象
Intent objectIntent = new Intent(ActivityA.this, ActivityB.class);
i.putExtra("sendObjects", UserVo ); //Your object here
startActivity(objectIntent);

ActivityB.java - 接收意图

UserVo mReceiveObjects = (UserVo)getIntent().getExtras().get("sendObjects");