【问题标题】:Serializable object in intent returning as String意图中的可序列化对象以字符串形式返回
【发布时间】:2011-03-04 14:54:52
【问题描述】:

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

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

我尝试为调用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;
    ...
 }

【问题讨论】:

    标签: android search android-intent serializable


    【解决方案1】:

    Read my answer 回答类似的问题。基本问题是MatrixCursor 仅适用于基本类型,并且依赖AbstractCursor 填充CursorWindow 在进程之间传递数据。 AbstractCursor 通过在每一行数据字段上调用 ​​Object#toString 来做到这一点。换句话说,您不能通过MatrixCursor 在进程之间传递任意对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-27
      • 2017-04-16
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-25
      • 2020-12-27
      相关资源
      最近更新 更多