2014-02-13 67 views
7

我试图通过使用下面的代码如何在Android中将gson序列化对象传递给Intent?

intent.putExtra("com.example", vo); // vo is the gson serialised object.

传递GSON序列化对象的意图,但它抛出运行时异常,请帮助。

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.d.a) 
      at android.os.Parcel.writeSerializable(Parcel.java:1285) 
      at android.os.Parcel.writeValue(Parcel.java:1233) 
      at android.os.Parcel.writeMapInternal(Parcel.java:591) 
      at android.os.Bundle.writeToParcel(Bundle.java:1646) 
      at android.os.Parcel.writeBundle(Parcel.java:605) 
      at android.content.Intent.writeToParcel(Intent.java:6831) 
      at  android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:1927) 
      at android.app.Instrumentation.execStartActivity(Instrumentation.java:1419) 
      at android.app.Activity.startActivityForResult(Activity.java:3390) 
      at android.app.Activity.startActivityForResult(Activity.java:3351) 
      at android.app.Activity.startActivity(Activity.java:3587) 
      at android.app.Activity.startActivity(Activity.java:3555) 

回答

23

不,你是以错误的方式使用它。

把对象的意向为:

Gson gson = new Gson(); 
Intent intent = new Intent(Source.this, Target.class); 
intent.putExtra("obj", gson.toJson(yourObject)); 

,并获取对象在另一个活动为:

Gson gson = new Gson(); 
String strObj = getIntent().getStringExtra("obj"); 
SourceObject obj = gson.fromJson(strObj, SourceObject.class); 
+0

阅读器?不是strObj? –

+0

我在我的应用程序中以相同的方式执行此操作。我有一个列表,在那里我预览了这些项目。当用户点击其中一些时,我会显示一个新的详细活动。为了避免用户点击每个项目调用一次API,我已经将这种技术用于Gson。我的问题是...有没有更好的方法来做到这一点?哪一个更好?再次调用API或者使用Gson序列化/反序列化?谢谢。 – Kashmir

0

当你的对象或者模型扩展RealmObject你需要使用:

Step1:

Gson gson = new GsonBuilder() .setExclusionStrategies(new ExclusionStrategy() { 
@Override 
public boolean shouldSkipField(FieldAttributes f) { 
    return f.getDeclaringClass().equals(RealmObject.class); 
} 

@Override 
public boolean shouldSkipClass(Class<?> clazz) { 
    return false; 
} 
}) 
.create(); 

而且

intent.putExtra("userfrom",gson.toJson(obj)); 

第二步:

Gson gson = new GsonBuilder().create(); 



user =gson.fromJson(getIntent().getStringExtra("userfrom"),User.class); 

我用这为通数据与意图,但对改装工作

1

我加implements Serializable到我的模式与其他模式(分车型)使用由我的模型。然后,我可以经由意图传递GSON对象:

public class MyModel implements Serializable { 
    SubModel subModel; 
} 

public class SubModel implements Serializable { 
    ... 
} 

在片段:

Intent startIntent = new Intent(getContext(), NextActivity.class); 
startIntent.putExtra("mymodel", myModelObject); 
startActivity(startIntent); 

在下一活动:

Intent intent = getIntent(); 
MyModel mymodel = (MyModel) intent.getSerializableExtra("mymodel"); 
// test if we get the model correctly: 
setTitle(mymodel.getName()); 
相关问题