【问题标题】:Parcelable encountered IOException writing serializable object getactivity()Parcelable 遇到 IOException 写入可序列化对象 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)。

标签: android android-intent serialization


【解决方案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(...) 时忽略该变量。

    【讨论】:

    【解决方案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{
                        } 
                      }
                  

                  【讨论】:

                    猜你喜欢
                    • 2013-08-11
                    • 2016-01-25
                    • 2019-07-21
                    • 2013-04-30
                    • 2020-07-22
                    • 2014-08-03
                    • 2021-12-04
                    相关资源
                    最近更新 更多