Некоторые объекты parcelables, собранные в Intent / bundle, могут сами вмешиваться и ставить под угрозу чтение Intent / Bundle?

#java #android #bundle #android-intent #parcelable

#java #Android #пакет #android-намерение #parcelable

Вопрос:

Некоторые объекты parcelables, собранные в Intent / bundle, могут сами вмешиваться и ставить под угрозу чтение Intent / Bundle?

Я извлекаю код, в котором, как мне кажется, есть проблема. Этот код работает:

 public void writeToParcel(Parcel arg0, int arg1) {
    arg0.writeParcelable(object1, arg1);
    arg0.writeTypedList(arraylist1); 

}

public void readFromParcel(Parcel in) {
    object1  = in.readParcelable(object1.class.getClassLoader());
    arraylist1 = new ArrayList<object3>();
    in.readTypedList(arraylist1, object3.CREATOR);
   }
  

но если я добавлю другой сложный разделяемый объект (со встроенным разделяемым списком массивов):

 public void writeToParcel(Parcel arg0, int arg1) {
    arg0.writeParcelable(object1, arg1);
    arg0.writeParcelable(object2, arg1);
    arg0.writeTypedList(arraylist1); 

}

public void readFromParcel(Parcel in) {
    object1  = in.readParcelable(object1.class.getClassLoader());
    object2 = in.readParcelable(object2.class.getClassLoader());
    arraylist1 = new ArrayList<object3>();
    in.readTypedList(arraylist1, object3.CREATOR);
   }
  

Я получаю букле с более чем 10000000 элементами для arraylist1 (или другие непонятные проблемы)

хотя, если я удаляю строки с помощью arraylist1, это работает:

 public void writeToParcel(Parcel arg0, int arg1) {
    arg0.writeParcelable(this.object1, arg1);
    arg0.writeParcelable(this.object2, arg1); 

}

public void readFromParcel(Parcel in) {
    object1  = in.readParcelable(object1.class.getClassLoader());
    object2 = in.readParcelable(object2.class.getClassLoader());
   } 
  

Я пытался создать объект, который расширяет ArrayList и реализует Parcelable, но у меня возникли некоторые другие проблемы (например, android.os.BadParcelableException: ClassNotFoundException при отмене сопоставления 🙂

Если эти объекты сами вмешиваются, поэтому я должен использовать несколько пакетов, чтобы поместить эти разные объекты в одно и то же намерение?

Ответ №1:

Я думаю, что однажды у меня была такая же проблема. Насколько я помню, я исправил это, записывая / читая Parcelable всегда после всех других типов. Что — то вроде:

 public void writeToParcel(Parcel arg0, int arg1) {
    arg0.writeTypedList(arraylist1); 

    arg0.writeParcelable(object1, arg1);
    arg0.writeParcelable(object2, arg1);
}

public void readFromParcel(Parcel in) {
    arraylist1 = new ArrayList<object3>();
    in.readTypedList(arraylist1, object3.CREATOR);

    object1  = in.readParcelable(object1.class.getClassLoader());
    object2 = in.readParcelable(object2.class.getClassLoader());
}
  

(Хотя я не пробовал этот код)