2

私は次のクラスを持っています:

public class DetailedProduct implements Serializable {
    //attributes + get and set
    private Colour colour;
    //get+set

  public class Colour implements Serializable{
     private ArrayList<Image> images;
    //get+set

    public Image[] getImages() {
      return images.toArray(new Image[images.size()]);
    }
  }

  public class Image implements Serializable{

    private static final long serialVersionUID = 3460333138445770749L;
    private String image1;
    private String image2;
    private String image3;

        //get/set methods
  }
 }

その後、次のようにインテントを作成しました

  DetailedProduct.Colour mCurrentColour;
  Intent myIntent = new Intent(DetailsActivity.this, ImageGallery.class);
  myIntent.putExtra("Images", mCurrentColour.getImages());
  startActivity(myIntent);

ImageGallery クラスで、次のコードを試しました。

   Serializable extras = getIntent().getSerializableExtra("Images");
    if (extras != null) {
        images = (Image[]) extras;
    }

しかし、私は次の例外を取ります: java.lang.RuntimeException: Unable to start activity ComponentInfo{com./com.productdetails.ProductImageGallery}: java.lang.ClassCastException: java.lang.Object[] cannot be cast to com. productdetails.DetailedProduct$Image[]

シリアル化可能を画像の配列に正しくキャストするにはどうすればよいですか

4

4 に答える 4

0

画像をarrayListとして渡しました。しかし、あなたはそれを配列として取っています。

次のコードを使用します

Serializable extras = getIntent().getSerializableExtra("Images");
    if (extras != null) {
        images = (ArrayList<Image>) extras;
    }
于 2013-03-19T12:32:54.863 に答える
0

Android ランタイムは配列のシリアル化に失敗します。配列型は引き続き を実装しますがSerializable、インテントで使用されるバンドルから戻ってくると、すべての情報が失われます (常に型を含む) Ljava.lang.ObjectParcelable.

達成できるのは、Parcelableオブジェクトのコレクションを送信するArrayListことですが、元のサンプルで使用するデータ構造でもある の形式です。呼び出しコードは次のようになります。

Intent intent = new Intent(this, Target.class);
ArrayList<Foo> data = new ArrayList<Foo>();
data.add(new Foo());

intent.putParcelableArrayListExtra("data", data);
intent.putExtra("serializable", new Foo[] {new Foo()});
startActivity(intent);

という名前の通常のダミー クラスを使用しましたが、実装は非常に面倒Fooであることに注意してください。Parcelableさらに、クラスには typestaticという名前のフィールドが必要であり、内部型ではこれは Java 言語ではまったく不可能です。そのため、ネストされた (静的) クラスに切り替え、最終的に現在の外部インスタンスをコンストラクターに渡し、それに応じてフィールドの可視性を変更する必要があります ( toまたは package-private から)。ちなみに、結合が減るため、これによりコードベースのテスト容易性も向上します。私が言いたいのは、このコンパイルできないソースの代わりに:CREATORParcelable.Creator<T>privatepublic

public class Product implements Parcelable {
  public class Color implements Parcelable {
    public static final Parcelable.Creator<Color> CREATOR; // Illegal!!!
  }
}

このようなもの

public class Product implements Parcelable{
  public static class Color implements Parcelable {
    public Color(Product exOuter) {
    }
  }
}

ただし、この方法では、囲んでいるクラスの非静的メンバーにアクセスできないことに注意してColorくださいProduct

于 2013-03-19T22:58:04.827 に答える
0

簡単に考えてみると、単純に画像を bytearray[] にすることができます。バイト配列はシリアライズ可能なプリミティブ型であるためです。

于 2013-03-19T12:30:49.593 に答える
0

あなたのキャストは正しくありません

 java.lang.ClassCastException: java.lang.Object[] cannot be cast to com.productdetails.DetailedProduct$Image[]

ListArray をインテントに与え、それを配列でキャストしようとします

この行は正しくありません

 if (extras != null) {
        images = (Image[]) extras;
    }

と置換する

 if (extras != null) {
        images = (ListArray<Image>) extras;
    }
于 2013-03-19T12:31:02.423 に答える