Сериализуемый объект в намерении, возвращающемся как String - PullRequest
4 голосов
/ 16 июня 2010

В моем приложении я пытаюсь передать сериализуемый объект через намерение другому действию.Цель не полностью создана мной, она создается и передается через поисковое предложение.

В поставщике контента для предложения поиска объект создается и помещается в столбец SUGGEST_COLUMN_INTENT_EXTRA_DATA MatrixCursor.Однако, когда в получающем действии я вызываю getIntent().getSerializableExtra(SearchManager.EXTRA_DATA_KEY), возвращаемый объект имеет тип String, и я не могу привести его в исходный класс объекта.

Я попытался создать упаковку для моего объекта, которая вызывает out.writeSerializable(...), и использовал ее вместо этого, но произошло то же самое.

Возвращаемая строка похожа на универсальный объект toString (), то есть com.foo.yak.MyAwesomeClass@4350058, поэтому я предполагаю, что toString () вызывается где-то, где у меня нет контроля.

Надеюсь, мне просто не хватает чего-то простого.Спасибо за помощь!

Редактировать: Часть моего кода

Это в поставщике контента, который действует как полномочия поиска:

//These are the search suggestion columns 
private static final String[] COLUMNS = {
    "_id",  // mandatory column
    SearchManager.SUGGEST_COLUMN_TEXT_1,
    SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA
};

//This places the serializable or parcelable object (and other info) into the search suggestion
private Cursor getSuggestions(String query, String[] projection) {
    List<Widget> widgets = WidgetLoader.getMatches(query);

    MatrixCursor cursor = new MatrixCursor(COLUMNS);
    for (Widget w : widgets) {
        cursor.addRow(new Object[] {
                           w.id
                           w.name
                           w.data //This is the MyAwesomeClass object I'm trying to pass
                           });
    }

    return cursor;
}

Это в действиикоторый получает предложение поиска:

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Object extra = getIntent().getSerializableExtra(SearchManager.EXTRA_DATA_KEY); 
    //extra.getClass() returns String, when it should return MyAwesomeClass, so this next line throws a ClassCastException and causes a crash
    MyAwesomeClass mac = (MyAwesomeClass)extra;
    ...
 }

1 Ответ

6 голосов
/ 17 июня 2010

Прочтите мой ответ на аналогичный вопрос. Основная проблема заключается в том, что MatrixCursor работает только для базовых типов и зависит от AbstractCursor для заполнения CursorWindow для передачи данных между процессами. AbstractCursor делает это, вызывая Object#toString в каждом поле данных строки. Другими словами, вы не можете передавать произвольные объекты между процессами через MatrixCursor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...