2013-03-19 4 views
2

У меня есть следующий класс:Deserialize массив изображения объектов

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: U nable для запуска Activity ComponentInfo {com./com.productdetails.ProductImageGallery}: java.lang.ClassCastException: java.lang.Object [] не может быть передан в com.productdetails.DetailedProduct $ Image []

Как я могу сделать правильно сериализуемое к массиву Image

+0

Пожалуйста, введите код для 'getImages()' и наведите указатель на минимальную активность – Raffaele

+0

@Raffaele Посмотрите обновления –

+0

Вам действительно нужны внутренние классы (то есть нестатические)? – Raffaele

ответ

0

Из соображений быстрого вы можете просто сделать изображения в bytearray [], а так как массивы укусов примитивны, которые сериализуемы.

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; 
    } 
+1

'Object []' не может быть применено к 'Image []'. Это означает, что это массив объектов, а не список – Raffaele

0

Вы передали изображения как список массива. Но вы принимаете его как массив ..

Используйте следующий код

Serializable extras = getIntent().getSerializableExtra("Images"); 
    if (extras != null) { 
     images = (ArrayList<Image>) extras; 
    } 
+0

Он не показывает реализацию 'Colour.getImages()'. Он может, конечно, возвращать массив, а не только элемент списка – Raffaele

0

Андроида среда не может сериализовать массив. Тип массива по-прежнему реализует Serializable, но когда он возвращается из Bundle, используемого Intent, он потерял всю свою информацию (включая тип, который всегда Ljava.lang.Object. Некоторые ответы в Интернете предлагают использовать Parcelable, однако я попытался и сделал не удалось преуспеть.

Что может быть сделано, это передача коллекции объектов 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 довольно утомительна. Более того, для вашего класса требуется, чтобы поле static называлось CREATOR типа Parcelable.Creator<T>, а с внутренними типами это вообще не возможно на языке Java. Вот почему вам придется переключиться на вложенные (статические) классы, в результате передав ваш текущий внешний экземпляр в конструктор и изменив поля visibilty соответственно (от private до public или пакет-частный). Кстати, это также улучшит тестируемость вашей кодовой базы, потому что вы уменьшите сцепление.То, что я имею в виду, вместо этого uncompilable источника:

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.

Смежные вопросы