2016-07-26 9 views
2

putExtraを使用して、Activity1からActivity2に自分のデータを送信したいとします。Serializable SparseArray <カスタムオブジェクト>

私のカスタムオブジェクトは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(レシーバ):

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

最後にnullであることがわかります。

java.lang.RuntimeException:私は私のlogcatに次のエラーを取得しています

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

Parcelableは、直列化可能なオブジェクト(名前= com.ethos.ar.core.ARObjectCategory)を書き込むにIOException に遭遇しました java.io.NotSerializableException:android.util.SparseArray ......

Wによって引き起こさ........
ハットはSpraseArrayを持つObjectを他のActivityに送る正しい方法です。

ヒント:Parcelableが動作していません。あなたがtransient修飾子を使用する場合

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

おかげで

答えて

1

、そのメンバーは、シリアル化プロセスから除外されます。それがヌルオブジェクトを取得している理由です。トランジエント修飾子を削除すると、例外が発生しますが、その理由は何ですか?これは、 "SparseArray"オブジェクト自体が "Serializable"インタフェースを実装していないためです。オブジェクトが直列化可能になるには、そのすべての属性が "Serializable"インタフェースを実装しなければならないことに注意してください。今何をすることができますか?あなたはAndroidの "Parcelable"インターフェースを実装すべきですが、どうですか?パーセル可能なプロセスで "SparseArray"を使用する際に問題がある場合、別のオブジェクトにそれをパーセル化し、作成プロセスで元の "SparseArray"オブジェクトを再作成することができます。

関連する問題