2014-02-13 99 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()); 
相關問題