繁体   English   中英

在Android(Java)上序列化复杂对象

[英]Serializing Complex Objects on Android (Java)

我想做的是通过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”,或者甚至我将如何开始这样做。 附带说明一下,Ingredient和Step不是复杂的类:

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

上方是“致命异常:主”之后显示的行

然后我有很多错误,只说“在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新手

除非无法避免,否则在通过Intents发送数据时(由于性能问题),不应使用Serializable。 您应该改为实现Parcelable接口。 有很多问题,但实际上非常简单,除非您的类非常复杂。 您还可以在子类上实现writeParcelableArray() ,然后仅对成分和步骤列表使用writeParcelableArray()

我有类似的问题。 经过冗长乏味的调试,我意识到所有实例都将用作成员变量的类都将被序列化。 因此,在您的情况下,类IngredientStep以及类Recipe也需要序列化。 我希望这有帮助 :)

您不需要重写方法。 实现接口应该足够了。 您没有确切指定什么不起作用,但是只要您要序列化的对象具有可序列化的数据,复杂性就不会成为问题。

您无需执行任何操作。 只需声明“实现Serializable”即可使该类的实例可序列化。 如文档(http://developer.android.com/reference/java/io/Serializable.html)中所述,“实现此接口足以使大多数类可序列化。”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM