gpt4 book ai didi

android - Serializable SparseArray<自定义对象>

转载 作者:行者123 更新时间:2023-11-29 01:17:40 28 4
gpt4 key购买 nike

我想使用 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);

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

enter image description here

Activity2.java(接收者):

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 of children 是空的

enter image description here

最后,当我从我的对象中删除 transient 时。

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

我的 logcat 出现以下错误:

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.ethos.ar.core.ARObjectCategory) ........
Caused by: java.io.NotSerializableException: android.util.SparseArray ......

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

提示:Parcelable 不起作用:

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

谢谢

最佳答案

当您使用 transient 修饰符时,该成员将被排除在序列化过程之外。这就是您获得空对象的原因。当您删除 transient 修饰符时,您会收到一个异常,但为什么呢?那是因为“SparseArray”对象本身没有实现“Serializable”接口(interface)。请记住,为了使对象可序列化,其所有属性都必须实现“可序列化”接口(interface)。现在你能做什么?你应该实现Android的“Parcelable”接口(interface),但是如何实现呢?如果您在可分割过程中使用“SparseArray”时遇到问题,那么您可以将其分割到另一个对象,并在创建过程中重新创建原始“SparseArray”对象。

关于android - Serializable SparseArray<自定义对象>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38586997/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com