Parcelable 遇到 IOException 写入可序列化对象 getactivity()

Posted

技术标签:

【中文标题】Parcelable 遇到 IOException 写入可序列化对象 getactivity()【英文标题】:Parcelable encountered IOException writing serializable object getactivity() 【发布时间】:2014-06-02 07:12:42 【问题描述】:

所以我在 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)

【问题讨论】:

使用 LogCat 检查与您的异常相关的整个 Java 堆栈跟踪。如果您不了解堆栈跟踪,请将其粘贴到此处。另外,DSLL 是什么,Grade 是什么? DSLL(DoubleSortedLinkedList) 和 Grade 另一个我创建的类,它们也是可序列化的。 我发布了 LogCar 堆栈跟踪 不直接相关,但是......在我的例子中,我试图序列化一个在不可序列化的外部类中定义的内部类。我了解到非静态内部类包含对其外部类的引用(请参阅this question)。 另见***.com/questions/61758963/…。 【参考方案1】:
Caused by: java.io.NotSerializableException: com.resources.student_list.DSLL$DNode

您的DSLL 类似乎有一个DNode 静态内部类,而DNode 不是Serializable

【讨论】:

@user2896762:通常,在 Android 上,从堆栈跟踪的底部开始,一直到最后一行 Caused by。这通常会指向特定的问题。堆栈跟踪的所有其他节表示围绕跟踪底部“真实”异常的包装异常。 谢谢!!! @user2896762 和@CommonsWare 我阅读了堆栈跟踪...发现我班级中的一个对象未​​序列化。现在它正在工作。 Caused by: java.io.NotSerializableException: @CommonsWare 如何使用上述代码。你能帮我吗? Model 中的每一个内部类都必须序列化。 您指出了原因,但没有指出解决方案!我认为 Fransisco 的答案应该是公认的。【参考方案2】:

你的 OneThread 类也应该实现 Serializable。所有子类内部子类都必须实现Serializable

这对我有用...

【讨论】:

【参考方案3】:

如果您不能使 DNode 可序列化,一个好的解决方案是将“瞬态”添加到变量中。

例子:

public static transient DNode dNode = null;

这将在使用 Intent.putExtra(...) 时忽略该变量。

【讨论】:

Java 中的transient 关键字用于指示不应序列化字段。完整答案在这里:***.com/a/910522/1306012【参考方案4】:

如果你的 POJO 包含任何其他也应该实现 Serializable 的模型

【讨论】:

【参考方案5】:

对我来说,这是通过使变量与类瞬态来解决的。

之前的代码:

public class UserLocation implements Serializable 
   public Location lastKnownLocation;
   public UserLocation() 

代码后

public class UserLocation implements Serializable 
    public transient Location lastKnownLocation;
    public UserLocation() 
   

【讨论】:

这对我不起作用。我不能让它瞬态,因为我实际上需要代码库中其他地方的那个变量的值。 这对我有帮助。谢谢【参考方案6】:

由于任何内部类或其他引用的类未实现可序列化实现,因此发生异常。所以请确保所有引用的类都必须实现可序列化的实现。

【讨论】:

【参考方案7】:

当您的自定义类具有其他类的属性时会出现问题,例如“位图”。我所做的是将属性字段从“私人位图照片”更改为“私人临时位图照片”。但是,在接收器活动中我 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);

【讨论】:

【参考方案8】:

需要将 bean 类中的所有 arraylist 更改为 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;
        
    
 

【讨论】:

【参考方案9】:

就我而言,我也必须将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);

【讨论】:

【参考方案10】:

我也解决了这些错误,并且我在 modelClass 中进行了一些更改,它们实现了 Serializable 接口,例如:

在该模型类中,还使用 ​​writeToParcel() 覆盖方法实现 Parcelable 接口

然后 "create creator" 出现错误,所以 CREATOR 是编写的,并且还使用 带有参数和不带参数的模型类构造器创建..

       @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() 是 “写入我们的属性”

【讨论】:

【参考方案11】:

Grade 类也必须实现 Serializable

public class Grade implements Serializable 
.....your content....

【讨论】:

【参考方案12】:

我遇到了同样的问题,问题是有一些带有 static 关键字的内部类。删除 static 关键字后它开始工作,并且内部类应该实现 Serializable

问题场景

class A implements Serializable 
  class static B
   

解决者

class A implements Serializable 
      class B implements Serializable
       
    

【讨论】:

以上是关于Parcelable 遇到 IOException 写入可序列化对象 getactivity()的主要内容,如果未能解决你的问题,请参考以下文章

Parcelable 在写入可序列化对象时遇到 IOException

获取 Parcelable 遇到 IOException 写入可序列化对象

Parcelable 遇到 IOException 写入可序列化对象 getactivity()

Parcelable 在写入可序列化对象时遇到 IOException ......?

Parcelable 在将对象的实例发送到其他活动时遇到 IOException

java.lang.RuntimeException: Parcelable 遇到 IOException 写入可序列化