직렬화 가능 오브젝트 getactivity ()를 쓰는 중 Parcelable에 IOException이 발생했습니다.


171

그래서 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입니까?
CommonsWare

DSLL (DoubleSortedLinckedList) 및 내가 만든 다른 클래스를 등급 매기기도 직렬화 가능합니다.
user2896762

LogCar 스택 추적을 게시했습니다
user2896762

4
직접 관련이 없지만 ... 내 경우에는 직렬화 할 수없는 외부 클래스 안에 정의 된 내부 클래스를 직렬화하려고했습니다. 비 정적 내부 클래스에는 외부 클래스에 대한 참조가 포함되어 있음을 알았습니다 ( 이 질문 참조 ).
giraffe.guru

답변:


324
Caused by: java.io.NotSerializableException: com.resources.student_list.DSLL$DNode

귀하의 DSLL클래스는있는 것 같습니다 DNode정적 내부 클래스, 그리고 DNode하지 않습니다 Serializable.


60
@ user2896762 : 일반적으로 Android에서 스택 추적의 맨 아래부터 시작하여 마지막 Caused by줄 까지 작업하십시오 . 일반적으로 특정 문제를 지적합니다. 스택 추적의 다른 모든 스탠자는 추적 맨 아래의 "실제"예외 주위에 랩핑 된 예외를 나타냅니다.
CommonsWare

3
나는 방금 원인을 읽었으며 거의 ​​3 년 동안 이것을 알지 못했습니다.
Sterling Diaz

1
감사!!! @ user2896762 & @CommonsWare 스택 추적을 읽었습니다 ... 내 클래스의 개체 중 하나가 직렬화되지 않았습니다. 그리고 지금 작동합니다. Caused by: java.io.NotSerializableException:
VJ Vishal Jogiya

@CommonsWare 위의 코드를 사용하는 방법. pls 도와 드릴까요?
Jiks

4
Model의 모든 내부 클래스는 serialize되어야합니다.
Samir Mangroliya가

55

OneThread 클래스도 Serializable을 구현해야합니다. 모든 하위 클래스내부 하위 클래스Serializable을 구현 해야합니다 .

이것은 나를 위해 일했다 ...


24

DNode 직렬화를 수행 할 수없는 경우 변수에 "일시적"을 추가하는 것이 좋습니다.

예:

public static transient DNode dNode = null;

Intent.putExtra (...)를 사용할 때 변수를 무시합니다.


2
transientJava 의 키워드는 필드를 직렬화하지 않아야 함을 나타내는 데 사용됩니다. 전체 답변 : stackoverflow.com/a/910522/1306012
Bruno Bieri


5

나를 위해 이것은 클래스를 일시적으로 사용하여 변수를 만들어서 해결되었습니다.

전에 코드 :

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

후 코드

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

이것은 나를 위해 작동하지 않습니다. 실제로 코드베이스의 다른 곳에서 해당 변수의 값이 필요하기 때문에 일시적으로 만들 수 없습니다.
Taslim Oseni

이것은 나를 도왔다. 감사
바이퍼

2

이 문제는 사용자 정의 클래스에 "Bitmap"과 같은 다른 클래스의 속성이있을 때 발생합니다. 내가 만든 것은 속성 필드를 "비공개 비트 맵 사진"에서 "비공개 비트 맵 사진"으로 변경하는 것입니다. 그러나 수신자 활동에서 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);

2

내부 클래스 또는 다른 참조 클래스가 직렬화 가능한 구현을 구현하지 않았기 때문에 예외가 발생했습니다. 따라서 참조 된 모든 클래스가 직렬화 가능 구현을 구현해야합니다.


0

나는 또한 이러한 오류를 단계적으로 다루고 있으며 다음 과 같이 Serializable 인터페이스를 구현하는 modelClass 에서 약간의 변화가 있습니다 .

해당 Model 클래스에서도 writeToParcel () 재정의 메소드를 사용 하여 Parcelable 인터페이스 를 구현합니다.

그런 다음에 오류가 발생했습니다 "창조자를 만들 수" 있도록 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-> 모델 클래스

Parcel 인수를 가진 생성자는 "속성 읽기" 및 writeToParcel ()은 "속성 쓰기"입니다


0

Grade 클래스는 Serializable을 구현해야합니다.

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

0

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;
        }
    }
 }

0

나는 같은 문제에 직면했다. 문제는 정적 키워드가있는 내부 클래스가 있다는 것입니다. 정적 키워드를 제거한 후 작동하기 시작했으며 내부 클래스도 Serializable로 구현해야합니다.

문제 시나리오

class A implements Serializable{ 
  class static B{
  } 
}

해결 자

class A implements Serializable{ 
      class B implements Serializable{
      } 
    }

0

내 경우에는 내가 구현했다 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);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.