Parcelable gặp phải IOException viết đối tượng tuần tự hóa getactivity ()


171

Vì vậy, tôi nhận được điều này trong logcat:

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.resources.student_list.Student)

Tôi biết điều này có nghĩa là lớp sinh viên của tôi không được tuần tự hóa, nhưng đó là, đây là lớp sinh viên của tôi:

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

}

và đây là mã đang sử dụng phương thức 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);

                        } 

                    });

Xin hãy giúp tôi tìm ra những gì sai với điều này.

đây là toàn bộ 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)

Sử dụng LogCat để kiểm tra toàn bộ dấu vết ngăn xếp Java được liên kết với ngoại lệ của bạn. Nếu bạn không hiểu dấu vết ngăn xếp, dán nó ở đây. Ngoài ra, cái gì DSLLvà cái gì Grade?
CommonsWare

DSLL (DoubleSorticLinckedList) và Lớp khác được tạo bởi tôi, cả hai cũng được tuần tự hóa.
dùng2896762

Tôi đã đăng theo dõi ngăn xếp
LogCar

4
Không liên quan trực tiếp, nhưng ... trong trường hợp của tôi, tôi đã cố gắng tuần tự hóa một lớp bên trong được định nghĩa bên trong một lớp bên ngoài không tuần tự hóa. Tôi đã học được rằng các lớp bên trong không tĩnh chứa một tham chiếu đến lớp bên ngoài của chúng (xem câu hỏi này ).
hươu cao cổ.guru

Câu trả lời:


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

DSLLLớp của bạn dường như có một DNodelớp bên trong tĩnh, và DNodekhông Serializable.


59
@ user2896762: Nói chung, trên Android, hãy bắt đầu từ dưới cùng của dấu vết ngăn xếp và tìm đường đến Caused bydòng cuối cùng . Điều đó thường sẽ chỉ ra vấn đề cụ thể. Tất cả các khổ thơ khác của dấu vết ngăn xếp thể hiện các ngoại lệ được bao bọc xung quanh ngoại lệ "thực" ở dưới cùng của dấu vết.
CommonsWare

3
Tôi mới đọc được nguyên nhân bởi, tôi đã không biết điều này trong gần 3 năm phát triển.
Sterling Diaz

1
Cảm ơn!!! @ user2896762 & @CommonsWare Tôi đã đọc theo dõi Stack ... Tìm thấy Một trong những đối tượng trong lớp của tôi không được nối tiếp. và bây giờ nó đang hoạt động. Caused by: java.io.NotSerializableException:
VJ Vishal Jogiya

@CommonsWare Cách sử dụng mã trên. Bạn có thể giúp tôi không?
Jiks

4
Mỗi và mọi lớp bên trong trong Model phải được tuần tự hóa.
Samir Mangroliya

55

Lớp OneThread của bạn cũng nên triển khai Nối tiếp. Tất cả các lớp conlớp con bên trong phải thực hiện Nối tiếp .

cái này hiệu quả với tôi ...


24

Nếu bạn không thể tạo DNode tuần tự hóa, một giải pháp tốt sẽ là thêm "tạm thời" vào biến.

Thí dụ:

public static transient DNode dNode = null;

Điều này sẽ bỏ qua biến khi sử dụng Intent.putExtra (...).


2
Các transienttừ khóa trong Java được sử dụng để chỉ ra rằng một lĩnh vực không nên được đăng. Câu trả lời đầy đủ tại đây: stackoverflow.com/a/910522/1306012
Bruno Bieri

8

nếu POJO của bạn chứa bất kỳ mô hình nào khác bên trong thì cũng sẽ thực hiện Nối tiếp


5

Đối với tôi, điều này đã được giải quyết bằng cách làm cho biến số bị tạm dừng lớp.

Mã trước:

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

mã sau

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

Điều này không thể làm việc cho tôi. Tôi không thể làm cho nó thoáng qua vì tôi thực sự cần giá trị của biến đó ở một nơi khác trong cơ sở mã của tôi.
Taslim Oseni

Điều này đã giúp tôi. Cảm ơn
viper

2

Sự cố xảy ra khi lớp tùy chỉnh của bạn có thuộc tính một số lớp khác, ví dụ "Bitmap". Những gì tôi đã làm là thay đổi trường thuộc tính từ "ảnh Bitmap riêng tư" thành "ảnh Bitmap tạm thời riêng tư". Tuy nhiên, hình ảnh trống sau khi tôi getIntent () trong hoạt động nhận. Vì điều này, tôi đã chuyển lớp tùy chỉnh cho mục đích và tôi cũng đã tạo một mảng byte từ hình ảnh và chuyển nó một cách riêng biệt cho mục đích:

selectItem là đối tượng tùy chỉnh của tôi và getPlacePhoto là phương thức của anh ấy để lấy hình ảnh. Tôi đã thiết lập nó trước đây và bây giờ tôi chỉ cần lấy nó trước hơn là chuyển đổi nó và chuyển nó một cách riêng biệt:

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

`

Sau đó, trong hoạt động thu tôi nhận đối tượng của tôi và hình ảnh dưới dạng mảng byte, giải mã hình ảnh và đặt nó vào đối tượng của tôi làm thuộc tính ảnh.

 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

Ngoại lệ xảy ra do thực tế là bất kỳ lớp bên trong hoặc các lớp được tham chiếu khác đã không thực hiện triển khai tuần tự hóa. Vì vậy, hãy chắc chắn rằng tất cả các lớp được tham chiếu phải thực hiện việc thực hiện tuần tự hóa.


0

Tôi cũng đang xử lý các lỗi này và tôi có một chút thay đổi trong modelClass được triển khai giao diện Nối tiếp như:

Tại lớp Model đó cũng triển khai giao diện Parcelable với phương thức ghi đè writeToParcel ()

Sau đó, chỉ có lỗi để "tạo sáng tạo" nên CREATOR được viết và cũng tạo bằng trình tạo mô hình lớp với các đối số & không có đối số ..

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

Đây,

ArtistTrackClass -> ModelClass

Trình xây dựng với các đối số Parcel "đọc thuộc tính của chúng tôi" và writeToParcel () là "ghi thuộc tính của chúng tôi"


0

Lớp Lớp cũng phải thực hiện Nối tiếp

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

0

Cần thay đổi tất cả danh sách mảng thành wif serializable trong lớp bean:

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

Tôi đã đối mặt với cùng một vấn đề, vấn đề là có một số lớp bên trong với từ khóa tĩnh. Sau khi loại bỏ từ khóa tĩnh, nó bắt đầu hoạt động và lớp bên trong sẽ thực hiện để Nối tiếp

Kịch bản phát hành

class A implements Serializable{ 
  class static B{
  } 
}

Đã giải quyết bằng

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

0

Trong trường hợp của tôi, tôi đã phải thực hiện MainActivitynhư Serializablevậy. Vì tôi cần bắt đầu dịch vụ từ 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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.