Serializable SparseArray <custom object =“”>

时间:2016-07-26 10:10:49

标签: android

我想使用putExtra将我的数据从Activity1发送到Activity2。

我的自定义对象实现了Serializable:

public class ARObjectCategory implements Serializable {

private static final long serialVersionUID = 3128594851129501738L;

public int id;
public String name;
public transient ARObjectCategory parent;
public transient SparseArray<ARObjectCategory> children;
public transient Bitmap iconBitmap = null;
public String icon;
private boolean active = false;

public ARObjectCategory(int id, String name, ARObjectCategory parent) {
    this.id = id;
    this.name = name;
    this.parent = parent;
    this.children = new SparseArray<>();
}


public void addChild(ARObjectCategory child) {
    children.append(child.id, child);
    if (getActive())
        child.setActive(true);
}

public final ARObjectCategory getChild(int index) {
    return children.valueAt(index);
}

public final SparseArray<ARObjectCategory> getChildren() {
    return this.children;
}

public final int getParentLast() {

    ARObjectCategory parentTemp = this.parent;
    while (parentTemp.parent != null) {
        parentTemp = parentTemp.parent;
    }
    return parentTemp.id;
}


public final ARObjectCategory getChildById(int id) {
    return children.get(id, null);
}

public final int getChildrenCount() {
    return children.size();
}

public Boolean getActive() {
    return this.active;
}

public void setActive(Boolean bool) {
    this.active = bool;
}

public Bitmap getIconBitmap() {
    return iconBitmap;
}

public void setIconBitmap(Bitmap iconBitmap) {
    this.iconBitmap = iconBitmap;
}

public String getIcon() {
    return icon;
}

public void setIcon(String icon) {
    this.icon = icon;
}

}

Activity1.java(发件人):

 ARObjectCategory test1= adapter.getItem(position);
       Intent subCat= new Intent(getActivity(), SubCategoriesActivity.class);
        subCat.putExtra("test",test1);
        subCat.putExtra("selected",position);
       startActivity(subCat);

在调试模式下,我的对象看起来没问题。 SpraseArray得到了AROjcectCategory的对象。

enter image description here

Activity2.java(Reciever):

Bundle extras = getIntent().getExtras();
    if (extras != null) {
        int selected = extras.getInt("selected", -1);
        ARObjectCategory list = (ARObjectCategory) extras.getSerializable("test");

    SparseArray<ARObjectCategory> lista = list.getChildren();
  }

但是当我调试Activity2时。我看到我的孩子的SpraseArray是空的

enter image description here

最后,当我从对象中移除瞬态时。

public transient ARObjectCategory parent;
public transient SparseArray<ARObjectCategory> children;

我在logcat上收到以下错误:

  

java.lang.RuntimeException:Parcelable遇到IOException   编写可序列化对象(name =   com.ethos.ar.core.ARObjectCategory)........
   引起:   java.io.NotSerializableException:android.util.SparseArray ......

将具有SpraseArray的Object发送到其他Activity的正确方法是什么。

提示:Parcelable无效:

dest.writeParcelable(this.children);
SparseArray<ARObjectCategory> cannot be converted to SparseArray<Object>

由于

1 个答案:

答案 0 :(得分:1)

使用transient修饰符时,该成员将从序列化过程中排除。这就是你得到一个空对象的原因。当你删除transient修饰符然后你收到一个异常,但为什么?那是因为&#34; SparseArray&#34;对象本身并没有实现&#34; Serializable&#34;接口。请记住,为了使对象可序列化,那么它的所有属性都必须实现&#34; Serializable&#34;接口。现在你能做什么?你应该实现&#34; Parcelable&#34; Android界面如何?如果您在使用&#34; SparseArray&#34;时遇到问题在parcelable过程中,你可以将它包裹到另一个对象,并重新创建原始&#34; SparseArray&#34;创建过程中的对象。