android десериализует объект?

#android #android-intent

#Android #android-намерение

Вопрос:

как десериализовать этот тип:

 public Intent putExtra(String name, Serializable value)
  

пример:

  intent.putExtra("activityToPass", GoToThisActivity.class);
 ???
 getIntent().getExtras.getSerializable("activityToPass");
  

как это сделать, пожалуйста;

пожалуйста, помогите!!

Ответ №1:

Если вы хотите передать пользовательский объект из одного действия в другое, сначала у вас должен быть класс вашего пользовательского объекта для реализации java.io.Serializable :

 public class SomeObject implements Serializable {
    private String name;
    public SomeObject (final String name) {
        this.name = name;
    }
    [...]
}

final SomeObject myExtra = new SomeObject("any name");
  

Затем вы можете добавить этот myExtra к намерению, с которым вы вызываете свой новый Activity :

 final Intent intent = new Intent(this, GoToThisActivity.class);
intent.putExtra("serializedExtra", myExtra);
startActivity(intent);
  

Внутри метода вашего GoToThisActivity класса’ onCreate вы можете извлечь это дополнительное как:

 final Intent intent = getIntent();
if (intent.hasExtra("serializedExtra"))
    final SomeObject myExtra= (SomeObject)intent.
        getSerializableExtra("serializedExtra");
    [...]
}
  

И теперь у вас есть свой пользовательский объект в вашем новом действии.

Обновление 1: Передача класса другому действию с Intent
Если вы хотите передать Class экземпляр намерению:

 intent.putExtra("classExtra", GoToThisActivity.class);
  

и десериализовать его в другом действии:

 if (intent.hasExtra("classExtra"))
{
    final Class<?> classExtra= (Class<?>)intent.
        getSerializableExtra("classExtra");
    [...]
}
  

Обновление 2:
При десериализации массива пользовательских объектов вы должны убедиться, что элементы в этом массиве реализуют Serializable интерфейс.

Чтобы оставаться в своем примере:

 public class ButtonPick implements Serializable
{
    public static final ButtonPick EDIT = new ButtonPick();
    public static final ButtonPick DELETE = new ButtonPick();
}
  

Вы добавляете лишнее в Intent :

 intent.putExtra("buttonPicks", new ButtonPick[]
    {ButtonPick.DELETE,ButtonPick.EDIT});
  

И внутри другого действия десериализует его:

 if (intent.hasExtra("buttonPicks"))
{
    final Object[] buttonPicks= (Object[])intent.
        getSerializableExtra("buttonPicks");
        [...]
}
  

Вы ДОЛЖНЫ привести массив как Object[] независимо от исходного значения ButtonPicks[] .
Элементы внутри массива имеют свой правильный тип, поэтому внутри находятся

{ Кнопки выбора.РЕДАКТИРОВАТЬ, нажимать кнопки.УДАЛИТЬ }

Участники.
Вам нужно привести их по отдельности.

Комментарии:

1. как насчет передачи класса через serializable?, я больше не хочу создавать пользовательские объекты. пример: intent.putExtra(«activityToPass», GoToThisActivity.class ), поскольку для Java, GoToThisActivity.class является сериализуемым! Спасибо.

2. извините, я просто перепрыгнул через эту часть по ошибке, но, пожалуйста, ознакомьтесь с моим обновлением для передачи класса.

3. попробуем это освоить по рекашеру!

4. последний вопрос, сенсей, как десериализовать это, пока безуспешно: intent.putExtra(«buttonPicks», new ButtonPick[]{Кнопка выбора. УДАЛИТЬ, выбрать кнопку. РЕДАКТИРОВАТЬ} ); //где ButtonPick — это перечисление. Нужно ли мне создавать пользовательский объект для этого?

5. я опубликовал новое обновление с примером того, как десериализовать массивы, надеюсь, у вас это сработает.