ClassNotFoundException при десортировке списка посылок

Я пытаюсь отправить объект между двумя действиями. Объект заказа содержит список элементов, которые я реализовал следующим образом:

OrderItem Object:
@Override
public void writeToParcel(Parcel dest, int flags) {
   dest.writeInt(id);
   dest.writeParcelable(priceTableItem, flags);
   dest.writeInt(qunatity);
   dest.writeDouble(value); // quantity * unitValue
   dest.writeDouble(discount);
}

protected OrderItem(Parcel in) {
  id = in.readInt();
  priceTableItem =  in.readParcelable(PriceTableItem.class.getClassLoader());
  quantity = in.readInt();
  value = in.readDouble();
  discount = in.readDouble();
}

В PriceTableItem у меня есть ситуация, когда он может содержать идентификатор продукта или идентификатор «оценки» («оценка» - это когда продукт имеет цвет и размер), но никогда не может иметь оба значения.

поэтому я реализовал так:

@Override
public void writeToParcel(Parcel dest, int flags) {
   dest.writeInt(id);
   dest.writeParcelable(priceTable, flags);
   dest.writeValue(produto);
   dest.writeValue(grade);
   dest.writeDouble(unitPrice);
   dest.writeByte((byte) (isActive ? 1 : 0));
}

protected PriceTableItem(Parcel in) {
   id = in.readInt();
   priceTable = in.readParcelable(PriceTable.class.getClassLoader());
   product = (Product) in.readValue(Product.class.getClassLoader());
   grade = (Grade) in.readValue(Grade.class.getClassLoader());
   unitPrice = in.readDouble();
   isactive = in.readByte() != 0;
}

Проблема возникает, когда я передаю объект заказа из своего OrderListActivity в OrderDetailActivity. Он прочитал все атрибуты перед моим списком элементов. Когда он пытается прочитать PriceTable на OrderItem, я получаю:

java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.intelecto.intesigmobile/br.com.intelecto.intesigmobile.activity.PedidoDetailActivity}: android.os.BadParcelableException: ClassNotFoundException when unmarshalling:

Строка проблемы:

priceTableItem =  in.readParcelable(PriceTableItem.class.getClassLoader());

Любые идеи о том, как решить эту проблему?


person Geshner Inagaki    schedule 23.02.2016    source источник


Ответы (2)


До сих пор не знаю, что вызвало ошибку, но я решил проблему, как показано ниже.

Когда я передавал значение заказа, я использовал для этого только Intent, например:

Intent i = new Intent(this, OrderDetailActivity.class);
i.putExtras("order", order);
startActivity(i);

И, чтобы прочитать это, я делал так:

Order order = getIntent().getParcelableExtra("order");

Итак, я использовал Bundle для передачи значения.

Intent i = new Intent(this, OrderDetailActivity.class);

Bundle b = new Bundle();
b.putParcelable("order", order);

i.putExtras(b);
startActivity(i);

И

Bundle b = getIntent().getExtras();

Order order = b.getParcelable("order");
person Geshner Inagaki    schedule 24.02.2016

У меня была такая же ошибка, и строки, вызывающие ошибку, были следующими:

 ingredients = in.readParcelable(Ingredient.class.getClassLoader());

и

public static final Parcelable.Creator<RecipeContent> CREATOR = new Parcelable.Creator<RecipeContent>() {
    @Override
    public RecipeContent createFromParcel(Parcel in) {
        return new RecipeContent(in);
    }

Итак, что я сделал, и это помогло, так это упорядочить элементы in.read так же, как упорядочиваются значения в Parcel.

Вот подробности:

  public RecipeContent(int id, String recipeName, List<Ingredient> ingredients,
                     List<BakingStep> bakingSteps, String recipeImage) {
    this.id = id;
    this.recipeName = recipeName;
    this.ingredients = ingredients;
    this.bakingSteps = bakingSteps;
    this.recipeImage = recipeImage;
}

И затем, используя тот же порядок для in.read:

 public RecipeContent(Parcel in) {
    id = in.readInt();
    recipeName = in.readString();
    ingredients = in.readParcelable(Ingredient.class.getClassLoader());
    bakingSteps = in.readParcelable(BakingStep.class.getClassLoader());
    recipeImage = in.readString();
}

Надеюсь, это поможет и вам.

person Isa Vell    schedule 13.05.2018