parcelable에서 IOException이 발생했습니다. serialable object get activity()를 기록했습니다.
그래서 로그캣에 이 내용을 입력합니다.
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
클래스는 a를 가지고 있는것 같습니다.DNode
클래스,적부스고,고DNode
그렇지 않습니다Serializable
.
OneThread Class에서도 Serializable을 구현해야 합니다.모든 하위 클래스와 내부 하위 클래스는 Serializable을 구현해야 합니다.
이건 내게 도움이 되는...
DNode를 직렬화할 수 없다면 변수에 "일시적"을 추가하는 것이 좋은 해결책이 될 것입니다.
예:
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() {}
}
내부 클래스 또는 기타 참조된 클래스에서 직렬화 가능한 구현을 구현하지 않았기 때문에 예외가 발생했습니다.따라서 모든 참조 클래스가 직렬화 가능한 구현을 구현해야 합니다.
이 문제는 사용자 지정 클래스가 속성에 대해 "비트맵"과 같은 다른 클래스를 가질 때 발생합니다.제가 만든 것은 속성 필드를 "비공개 비트맵 사진"에서 "비공개 일시적 비트맵 사진"으로 변경하는 것입니다.그러나 수신기 활동에서 Intent()를 받으면 이미지가 비어 있습니다.이 때문에 사용자 지정 클래스를 인텐트로 전달했으며 이미지에서 바이트 배열을 만들어 인텐트로 전달했습니다.
선택된아이템은 나의 커스텀 오브젝트이고 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);
모든 배열 목록을 빈 클래스의 직렬화 가능한 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;
}
}
}
동일한 문제에 직면했습니다. 문제는 정적 키워드를 가진 일부 내부 클래스가 있다는 것이었습니다.정적 키워드를 제거한 후 작동하기 시작했으며 내부 클래스도 Serializable로 구현해야 합니다.
이슈시나리오
class A implements Serializable{
class static B{
}
}
해결 기준
class A implements Serializable{
class B implements Serializable{
}
}
또한 이러한 오류를 단계적으로 수행하고 있으며 직렬화 가능한 인터페이스를 구현한 modelClass에서 약간의 변화가 있습니다.
해당 Model 클래스에서 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];
}
};
여기서,
아티스트 트랙 클래스 -> 모델 클래스
Parcel 인수가 있는 생성자는 "우리의 속성 읽기" 및 writeToParcel()은 "우리의 속성 쓰기"입니다.
등급 클래스는 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);
}
언급URL : https://stackoverflow.com/questions/23142893/parcelable-encountered-ioexception-writing-serializable-object-getactivity
'code' 카테고리의 다른 글
이미지 버튼에 재료 디자인 터치 리플 적용? (0) | 2023.09.10 |
---|---|
Windows Forms 응용프로그램에 응용프로그램 설정을 저장하려면 어떻게 해야 합니까? (0) | 2023.09.10 |
PowerShell - Get-Credential 디코딩 암호? (0) | 2023.09.10 |
NS_ERROR_FAILURE : Firefox에서 실패 (0) | 2023.09.10 |
데이터 정렬은 클라이언트에서 수행해야 합니까 아니면 서버에서 수행해야 합니까? (0) | 2023.09.10 |