Parcelable IOException serileştirilebilir nesne getactivity yazma ()


172

bu yüzden ben logcat alıyorum:

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

Bunun öğrenci sınıfımın serileştirilemeyeceği anlamına geldiğini biliyorum, ama işte öğrenci sınıfım:

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

}

ve getIntent () yöntemini kullanan kod budur:

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

                        } 

                    });

lütfen bununla ilgili neyin yanlış olduğunu anlamama yardımcı olun.

İşte tüm 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)

Kural dışı durumunuzla ilişkili tüm Java yığın izlemesini incelemek için LogCat kullanın. Yığın izini anlamadıysanız buraya yapıştırın. Ayrıca, nedir DSLLve nedir Grade?
CommonsWare

DSLL (DoubleSortedLinckedList) ve Benim oluşturduğum başka bir sınıfta Notlandır, her ikisi de serileştirilebilir.
user2896762

LogCar yığın izini yayınladım
user2896762

4
Doğrudan ilgili değil, ama ... benim durumumda serileştirilemeyen bir dış sınıf içinde tanımlanan bir iç sınıfı serileştirmeye çalışıyordum. Statik olmayan iç sınıfların dış sınıflarına bir referans içerdiğini öğrendim ( bu soruya bakın ).
giraffe.guru

Yanıtlar:


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

Sizin DSLLsınıf bir gibi görünüyor DNodestatik iç sınıf ve DNodedeğildir Serializable.


60
@ user2896762: Genel olarak, Android'de yığın izlemenin altından başlayın ve son Caused bysatıra kadar ilerleyin . Bu genellikle belirli bir soruna işaret eder. Yığın izinin diğer tüm stanzları, izin altındaki "gerçek" istisna etrafına sarılmış istisnaları temsil eder.
CommonsWare

3
Ben sadece nedenini okumuştu, neredeyse 3 yıldır gelişmekte olduğunu bilmiyordum.
Sterling Diaz

1
Teşekkürler!!! @ user2896762 & @CommonsWare Yığın izini okudum ... Bulunan Sınıfımdaki nesnelerden biri Seri Değil. ve şimdi çalışıyor. Caused by: java.io.NotSerializableException:
VJ Vishal Jogiya

@CommonsWare Yukarıdaki kod nasıl kullanılır. Bana pls yardımcı olabilir misiniz?
Jiks

4
Modeldeki her bir iç sınıf serileştirilmelidir.
Samir Mangroliya

55

OneThread Sınıfınız da Serializable uygulamalıdır. Tüm alt sınıflar ve iç alt sınıflar mutlaka uygular Serializable .

bu benim için çalıştı ...


24

DNode serileştirilebilir yapamazsanız, değişkene "geçici" eklemek iyi bir çözüm olacaktır.

Misal:

public static transient DNode dNode = null;

Intent.putExtra (...) kullanılırken bu değişken değişmez.


2
transientJava anahtar bir alan getirilemez gerektiğini belirtmek için kullanılır. Tam cevap burada: stackoverflow.com/a/910522/1306012
Bruno Bieri

8

POJO'unuz içinde Seri hale getirilebilen başka bir model içeriyorsa


5

Benim için bu, değişkenli sınıf geçici hale getirilerek çözüldü.

Önceki kod:

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

sonra kodla

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

Bu benim için işe yaramaz. Aslında geçici yapamam çünkü aslında benim kod tabanı başka bir yerde bu değişkenin değeri gerekir.
Taslim Oseni

Bu bana yardımcı oldu. Teşekkürler
engerek

2

Özel sınıf, "Bitmap" gibi başka bir sınıf özelliği için olduğunda sorun oluşur. Yaptığım şey, özellik alanını "özel Bitmap fotoğrafı" ndan "özel geçici Bitmap fotoğrafı" olarak değiştirmek. Ancak alıcı etkinliğinde benInInentent () aldıktan sonra görüntü boş. Bu nedenle özel sınıf niyetine geçti ve ben de görüntüden bir bayt dizisi oluşturduk ve ayrı olarak niyetine geçmek:

selectedItem benim özel nesnem ve getPlacePhoto görüntü alma yöntemidir. Zaten daha önce ayarladım ve şimdi sadece dönüştürmek ve ayrı ayrı geçmek ilk olsun:

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

'

Sonra alıcı etkinliğinde nesnemi ve görüntüyü bayt dizisi olarak alıyorum, görüntünün kodunu çözdüm ve fotoğraf özelliği olarak nesneme ayarladım.

 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

İstisna, iç sınıfların veya başvurulan diğer sınıfların herhangi birinin serileştirilebilir uygulamayı uygulamadığı gerçeğinden kaynaklandı. Bu nedenle, başvurulan tüm sınıfların serileştirilebilir uygulamayı uygulaması gerektiğinden emin olun.


0

Ben de bu hatayı faz ve ben gibi Serializable arayüzü uygulanan modelClass biraz değişiklik :

Bu model sınıfı, uygulamaya en Parcelable arayüzü ile writeToParcel () geçersiz kılma yöntemi

Sonra sadece kadar hata var "yaratıcısı" böylece CREATOR yazma ve aynı zamanda oluşturduğunuz argümanlarla & kanıtlar olmaksızın modelclass işinin müteahhidi ..

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

Buraya,

ArtistTrackClass -> ModelClass

Parsel bağımsız değişkenleri ile "özniteliklerimizi okuyun" ve writeToParcel () yapıcısı "özniteliklerimizi yazın"


0

Grade sınıfı ayrıca Serializable

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

0

Fasulye sınıfındaki tüm arraylisti Serializable wif olarak değiştirmeniz gerekir:

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

Aynı sorunla karşı karşıya kaldım, sorunlar statik anahtar kelimeyle bazı iç sınıflar vardı. Statik anahtar kelimeyi kaldırdıktan sonra çalışmaya başladı ve ayrıca iç sınıf Serializable uygular

Sorun senaryosu

class A implements Serializable{ 
  class static B{
  } 
}

Çözen

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

0

Benim durumumda ben uygulamak zorunda MainActivityolduğu Serializableda. Çünkü şu adresten bir hizmet başlatmam gerekiyordu 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);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.