意图中的可序列化对象以String形式返回

时间:2010-06-16 18:26:52

标签: android search android-intent serializable

在我的应用程序中,我试图通过意图将可序列化对象传递给另一个活动。意图并非完全由我创建,它是通过搜索建议创建和传递的。

在搜索建议的内容提供程序中,创建对象并将其放置在MatrixCursor的SUGGEST_COLUMN_INTENT_EXTRA_DATA列中。但是,当我在接收活动中调用getIntent().getSerializableExtra(SearchManager.EXTRA_DATA_KEY)时,返回的对象是String类型,我无法将其转换为原始对象类。

我尝试为我的对象调用out.writeSerializable(...)制作一个parcelable包装,然后使用它,但同样的事情发生了。

返回的字符串就像一个通用的Object 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 个答案:

答案 0 :(得分:6)

Read my answer提出了类似的问题。基本问题是MatrixCursor仅适用于基类型,并依赖于AbstractCursor来填充CursorWindow以在进程之间传递数据。 AbstractCursor通过在每个行数据字段上调用Object#toString来完成此操作。换句话说,您不能通过MatrixCursor在进程之间传递任意对象。