だから私はlogcatでこれを得ています:
Java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.resources.student_list.Student)
これは私の学生クラスが直列化可能ではないことを意味しますが、それは、ここに私の学生クラスです:
import Java.io.Serializable;
public class Student implements Comparable<Student>, Serializable{
private static final long serialVersionUID = 1L;
private String firstName, lastName;
private DSLL<Grade> gradeList;
public Student() {
firstName = "";
lastName = "";
gradeList = new DSLL<Grade>();
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public DSLL<Grade> getGradeList() {
return gradeList;
}
public void setGradeList(DSLL<Grade> gradeList) {
this.gradeList = gradeList;
}
public int compareTo(Student arg0) {
return this.lastName.compareTo(arg0.getLastName());
}
}
これがgetIntent()メソッドを使用しているコードです。
public void onItemClick(AdapterView<?> parent, View viewClicked, int pos,
long id) {
Student clickedStudent = studentList.get(pos);
int position = pos;
Intent intent = new Intent(getActivity().getApplicationContext(), ShowStudentActivity.class);
Log.e("CINTENT","CREATED!!!");
intent.putExtra("clickedStudent",clickedStudent);
intent.putExtra("newStudentList",newStudentList);
intent.putExtra("position",position);
Log.e("putExtra","Passed");
Log.e("Start activity","passed");
startActivity(intent);
}
});
私がこれで間違っていることを理解するのを手伝ってください。
これが全体のLogCatです。
04-17 16:12:28.890: E/AndroidRuntime(22815): FATAL EXCEPTION: main
04-17 16:12:28.890: E/AndroidRuntime(22815): Java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.resources.student_list.Student)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.os.Parcel.writeSerializable(Parcel.Java:1181)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.os.Parcel.writeValue(Parcel.Java:1135)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.os.Parcel.writeMapInternal(Parcel.Java:493)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.os.Bundle.writeToParcel(Bundle.Java:1612)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.os.Parcel.writeBundle(Parcel.Java:507)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.content.Intent.writeToParcel(Intent.Java:6111)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.Java:1613)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1422)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.app.Activity.startActivityForResult(Activity.Java:3191)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.support.v4.app.FragmentActivity.startActivityFromFragment(FragmentActivity.Java:848)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.support.v4.app.Fragment.startActivity(Fragment.Java:878)
04-17 16:12:28.890: E/AndroidRuntime(22815): at com.example.student_lists.MainActivity$DummySectionFragment$2.onItemClick(MainActivity.Java:477)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.widget.AdapterView.performItemClick(AdapterView.Java:292)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.widget.AbsListView.performItemClick(AbsListView.Java:1058)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.widget.AbsListView$PerformClick.run(AbsListView.Java:2514)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.widget.AbsListView$1.run(AbsListView.Java:3168)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.os.Handler.handleCallback(Handler.Java:605)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.os.Handler.dispatchMessage(Handler.Java:92)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.os.Looper.loop(Looper.Java:137)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.app.ActivityThread.main(ActivityThread.Java:4447)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.lang.reflect.Method.invokeNative(Native Method)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.lang.reflect.Method.invoke(Method.Java:511)
04-17 16:12:28.890: E/AndroidRuntime(22815): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:784)
04-17 16:12:28.890: E/AndroidRuntime(22815): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:551)
04-17 16:12:28.890: E/AndroidRuntime(22815): at dalvik.system.NativeStart.main(Native Method)
04-17 16:12:28.890: E/AndroidRuntime(22815): Caused by: Java.io.NotSerializableException: com.resources.student_list.DSLL$DNode
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.Java:1364)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.Java:1671)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1517)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1481)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.Java:979)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.Java:368)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.Java:1074)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.Java:1404)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.Java:1671)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1517)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1481)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.Java:979)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.Java:368)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeHierarchy(ObjectOutputStream.Java:1074)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.Java:1404)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.Java:1671)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1517)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:1481)
04-17 16:12:28.890: E/AndroidRuntime(22815): at Android.os.Parcel.writeSerializable(Parcel.Java:1176)
Caused by: Java.io.NotSerializableException: com.resources.student_list.DSLL$DNode
DSLL
クラスはDNode
静的内部クラスを持っているようですが、DNode
はSerializable
ではありません。
あなたのOneThreadクラスもSerializableを実装するべきです。すべてのサブクラスおよび内部サブクラス must Serializableを実装する.
これは私のために働いています...
もしあなたがDNodeをシリアライズ可能にすることができないなら、良い解決策は変数に "transient"を追加することでしょう。
例:
public static transient DNode dNode = null;
Intent.putExtra(...)を使用するとき、これは変数を無視します。
もしあなたがPOJOの中にSerializableも実装すべき他のモデルが含まれているなら
私にとっては、クラスを一時的に変更することでこれを解決しました。
前のコード:
public class UserLocation implements Serializable {
public Location lastKnownLocation;
public UserLocation() {}
}
後のコード
public class UserLocation implements Serializable {
public transient Location lastKnownLocation;
public UserLocation() {}
}
あなたのカスタムクラスが他のクラスをプロパティとして持っているときに問題が発生します。 「ビットマップ」私が作ったのは、プロパティフィールドを "private Bitmap photo"から "private transient bitmap photo"に変更することです。ただし、レシーバアクティビティでgetIntent()を実行した後、画像は空になります。このため、カスタムクラスをインテントに渡し、さらに画像からバイト配列を作成して、それをインテントに別々に渡します。
selectedItemは私のカスタムオブジェクトで、getPlacePhotoは画像を取得するための彼のメソッドです。すでに設定していますが、変換して別々に渡すよりも先に取得するだけです。
Bitmap image = selectedItem.getPlacePhoto();
image.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
Intent intent = new Intent(YourPresentActivity.this,
TheReceiverActivity.class);
intent.putExtra("selectedItem", selectedItem);
intent.putExtra("image", byteArray);
startActivity(intent);
`
それからレシーバーアクティビティで、私は自分のオブジェクトと画像をバイト配列として取得し、画像をデコードしてそれを写真プロパティとして自分のオブジェクトに設定します。
Intent intent = getIntent();
selectedItem = (ListItem) intent.getSerializableExtra("selectedItem");
byte[] byteArray = getIntent().getByteArrayExtra("image");
Bitmap image = BitmapFactory.decodeByteArray(byteArray, 0,
byteArray.length);
selectedItem.setPhoto(image);
私はまたこれらのエラーを段階的に見ています、そして私はmodelClassのちょっとした変更を実装していますSerializable interfaceのように:
そのModelクラスはParcelable interfacewithwriteToParcel()overrideメソッドも実装しています
それから、「create creator」にエラーが出たので、CREATORと書いて、modelclassコンストラクタで作成してください。引数あり、引数なし..
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(name);
}
protected ArtistTrackClass(Parcel in) {
id = in.readString();
name = in.readString();
}
public ArtistTrackClass() {
}
public static final Creator<ArtistTrackClass> CREATOR = new Creator<ArtistTrackClass>() {
@Override
public ArtistTrackClass createFromParcel(Parcel in) {
return new ArtistTrackClass(in);
}
@Override
public ArtistTrackClass[] newArray(int size) {
return new ArtistTrackClass[size];
}
};
ここに、
ArtistTrackClass - > ModelClass
Parcel引数を持つコンストラクタは「属性を読む」、writeToParcel()は「属性を書く」
私は同じ問題に直面しました、問題は静的キーワードを持ついくつかの内部クラスがあることでした。静的キーワードを削除した後、それは動作し始め、内部クラスはSerializableに実装する必要があります
class A implements Serializable{
class static B{
}
}
class A implements Serializable{
class B implements Serializable{
}
}
gradeクラスはSerializableも実装しなければなりません
public class Grade implements Serializable {
.....your content....
}
私の場合、MainActivity
をSerializable
として実装する必要がありました。原因MainActivity
からサービスを開始する必要がありました。
public class MainActivity extends AppCompatActivity implements Serializable {
...
musicCover = new MusicCover(); // A Serializable Object
...
sIntent = new Intent(MainActivity.this, MusicPlayerService.class);
sIntent.setAction(MusicPlayerService.ACTION_INITIALIZE_COVER);
sIntent.putExtra(MusicPlayerService.EXTRA_COVER, musicCover);
startService(sIntent);
}
例外は、内部クラスまたは他の参照クラスのいずれもが直列化可能を実装していないという事実のために発生しました。そのため、参照可能なすべてのクラスを直列化可能に実装します。
Beanクラスですべての配列リストをSerializable wifに変更する必要があります
public static class PremiumListBean implements Serializable {
private List<AddOnValueBean> AddOnValue;
public List<AddOnValueBean> getAddOnValue() {
return AddOnValue;
}
public void setAddOnValue(List<AddOnValueBean> AddOnValue) {
this.AddOnValue = AddOnValue;
}
public static class AddOnValueBean implements Serializable{
@SerializedName("Premium")
private String Premium;
public String getPremium() {
return Premium;
}
public void setPremium(String Premium) {
this.Premium = Premium;
}
}
}