【问题标题】:Serializing Complex Objects on Android (Java)在 Android (Java) 上序列化复杂对象
【发布时间】:2012-02-29 14:57:03
【问题描述】:

我想要做的是通过 Intents 发送一个对象;我一直在考虑像这样实现 Serializable:

Intent viewRecipe = new Intent(t, RecipeView.class);
Bundle input = new Bundle();
input.putSerializable("myRecipe", recipes.ReturnRecipe(position).toString());
viewRecipe.putExtras(input);
startActivity(viewRecipe);

但是,我猜是因为我有一个复杂的类它不起作用。谁能帮助解释我如何能够将此对象转换为序列化字符串?如果您知道一种更简单/更简单的方法,那也会很有帮助;可能还值得注意的是,我计划将其与 SQL 数据库进一步集成,但我现在被困住了。

班级是:

public class Recipe implements Serializable {

int mRating;
String mName;
String mDescription;

ArrayList<Ingredient> ingredients;
ArrayList<Step> instructions;
...
}

我不确定我是否必须重写“readObject”和“writeObject”,甚至我将如何开始这样做。作为旁注,成分和步骤不是复杂的类:

public class Ingredient {

String mName;
int mValue;
String mMeasurement;
    ...
}

public class Step {

int mIndex;
String task;
Date time;
    ...
}

长话短说,我不知道自己在做什么,可以使用一些指导。我已经阅读了很多关于如何序列化简单类的文章,但它们并没有真正帮助。

编辑:包括我得到的错误,当我从第二个活动中检索对象时,执行 Serilizable 会得到这个错误。

Intent myIntent = getIntent();
    Bundle extras = myIntent.getExtras(); //breaks on this line

    currentRecipe = (Recipe) extras.get("myRecipe");

02-29 15:15:56.521: E/AndroidRuntime(534): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pocket.recipes/com.pocket.recipes.RecipeView}: java.lang.ClassCastException: java.lang.String cannot be cast to com.pocket.recipes.Recipe

上面是“FATAL EXCEPTION: main”之后显示的行

然后我有很多错误只是说“在 android.app....”

我也有这行:

02-29 15:15:56.521: E/AndroidRuntime(534): Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to com.pocket.recipes.Recipe

抱歉,我是 Java/Android 新手

【问题讨论】:

    标签: java android serialization


    【解决方案1】:

    除非无法避免,否则在通过 Intent 发送数据时不应使用 Serializable(出于性能考虑)。您应该改为实现 Parcelable 接口。有很多杂乱无章的东西,但实际上很简单,除非你有一个非常复杂的类。您还可以在子类上实现 Parcelable,然后只需使用 writeParcelableArray() 作为您的成分和步骤列表。

    【讨论】:

    • 我不同意这一点。阅读此讨论stackoverflow.com/questions/5550670/…
    • 所以......接受的答案与我所说的一样,可序列化的性能很糟糕,你不应该使用它。
    • 我同意这部分,但 Parcelable 的使用是用于服务之间的进程间通信(或),而不是意图意图。阅读第二段。 OP 试图在 Intent 之间传递数据。
    • 对,但除了“使用捆绑包”之外,它们没有提供其他选择,从技术上讲,您将使用它,因为您将打包的对象放在捆绑包中。
    • 这与使用 Bundle 无关。它是关于 Parcelable 或 Serializable 的,一个对服务有好处,另一个对活动/意图有好处。
    【解决方案2】:

    您不需要重写方法。实现接口应该足够了。您还没有具体说明什么不起作用,但只要您尝试序列化的对象具有可序列化的数据,复杂性就不应该成为问题。

    【讨论】:

    • 好吧,当我尝试使用以下方法检索对象时它崩溃了: Intent myIntent = getIntent();捆绑附加服务 = myIntent.getExtras(); //currentRecipe.writeObject() currentRecipe = (Recipe) extras.get("myRecipe");
    • 我不知道这意味着什么,抱歉,我对 android + java 有点陌生
    • 假设你使用的是eclipse,Window > Show View > Other-->然后展开Android,然后选择LogCat,这里会看到错误堆栈。将其发布在您的问题中。
    • 当应用程序崩溃时,您看到的红色文本是什么。
    • 其他然后复制并粘贴所有红色文本,这似乎只是说“在 android.app ...”,我发布了两个在 OP 中脱颖而出的文本
    【解决方案3】:

    我遇到了类似的问题。经过漫长而繁琐的调试,我意识到所有实例作为成员变量的类都需要序列化。因此,在您的情况下,Ingredient 类和Step 类也需要与Recipe 类一起序列化。我希望这会有所帮助:)

    【讨论】:

      【解决方案4】:

      您不需要实现任何东西。只需声明“实现可序列化”即可使类的实例可序列化。 正如文档 (http://developer.android.com/reference/java/io/Serializable.html) 中所写,“实现此接口足以使大多数类可序列化。”

      【讨论】:

      • 问题是当我尝试从第二个活动中检索对象时它崩溃了
      • 可能是因为您必须确保不仅主类需要可序列化,而且其中的所有类也需要:如果您有包含对成分类实例的引用的配方,在为了序列化Recipe,你还必须声明Serializable成分类。
      【解决方案5】:

      我认为这取决于应用程序的上下文。 Parcelable 是一种选择,但其他应用程序实现 ContentProvider 并在 Intent 中传递 URL 或 id,然后用于在 ContentProvider 中查找项目。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多