IOException encontrado com pacotes gravável, getactivity de objeto serializável ()

171

então eu estou recebendo isso no logcat:

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

Sei que isso significa que minha turma não é serializável, mas aqui está minha turma:

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

}

e este é o código que está usando o método 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);

                        } 

                    });

por favor me ajude a descobrir o que há de errado nisso.

aqui está o LogCat inteiro:

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)
user2896762
fonte
Use o LogCat para examinar todo o rastreamento da pilha Java associado à sua exceção. Se você não entender o rastreamento de pilha, cole-o aqui. Além disso, o que é DSLLe o que é Grade?
CommonsWare
DSLL (DoubleSortedLinckedList) e Grade outra classe criada por mim, ambas também são serializáveis.
precisa saber é o seguinte
Eu publiquei o rastreamento de pilha do LogCar
#
4
Não está diretamente relacionado, mas ... no meu caso, eu estava tentando serializar uma classe interna definida dentro de uma classe externa não serializável. Aprendi que classes internas não estáticas contêm uma referência a sua classe externa (consulte esta pergunta ).
Giraffe.guru

Respostas:

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

Sua DSLLclasse parece ter uma DNodeclasse interna estática e DNodenão é Serializable.

CommonsWare
fonte
60
@ user2896762: Em geral, no Android, comece na parte inferior do rastreamento da pilha e vá até a última Caused bylinha. Isso geralmente aponta para o problema específico. Todas as outras estrofes do rastreamento de pilha representam exceções agrupadas em torno da exceção "real" na parte inferior do rastreamento.
CommonsWare
3
Acabei de ler o causado por, não sabia disso por quase três anos em desenvolvimento.
Sterling Diaz
1
Obrigado!!! @ user2896762 & @CommonsWare Li o rastreamento de pilha ... Encontrado Um dos objetos da minha classe não era serializado. e agora está funcionando. Caused by: java.io.NotSerializableException:
VJ Vishal Jogiya
@CommonsWare Como usar o código acima. Você pode me ajudar pls?
Jiks
4
Cada classe interna no Model deve ser serializada.
Samir Mangroliya 19/01/19
55

Sua classe OneThread também deve implementar Serializable. Todas as subclasses e subclasses internas devem implementar Serializable .

isso é trabalhado para mim ...

Pankaj Talaviya
fonte
24

Se você não puder tornar o DNode serializável, uma boa solução seria adicionar "transitório" à variável.

Exemplo:

public static transient DNode dNode = null;

Isso ignorará a variável ao usar Intent.putExtra (...).

Francisco Peters
fonte
2
A transientpalavra-chave em Java é usada para indicar que um campo não deve ser serializado. Resposta completa aqui: stackoverflow.com/a/910522/1306012
Bruno Bieri
8

se você POJO contiver qualquer outro modelo interno que também implemente Serializable

Sai Gopi N
fonte
5

Para mim, isso foi resolvido, tornando a variável dentro da classe transitória.

Código antes:

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

código depois

public class UserLocation implements Serializable {
    public transient Location lastKnownLocation;
    public UserLocation() {}
}   
Gomez NL
fonte
Isso não pode funcionar para mim. Não posso torná-lo transitório porque, na verdade, preciso do valor dessa variável em outro lugar da minha base de código.
Taslim Oseni 04/07/19
Isso me ajudou. Obrigado
viper
2

O problema ocorre quando sua classe personalizada tem para propriedade alguma outra classe, por exemplo, "Bitmap". O que fiz foi alterar o campo de propriedade de "foto Bitmap privada" para "foto Bitmap transitória privada". No entanto, a imagem está vazia depois que eu receboIntent () na atividade do receptor. Por isso, passei a classe personalizada para a intenção e também criei uma matriz de bytes a partir da imagem e a passo separadamente para a intenção:

selectedItem é meu objeto personalizado e getPlacePhoto é seu método para obter imagem. Eu já o configurei antes e agora eu o pego primeiro, depois o converto e o passo separadamente:

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

`

Em seguida, na atividade do receptor, obtenho meu objeto e a imagem como uma matriz de bytes, decodificamos a imagem e a definimos como meu objeto como propriedade da foto.

 Intent intent = getIntent();
 selectedItem = (ListItem) intent.getSerializableExtra("selectedItem");
 byte[] byteArray = getIntent().getByteArrayExtra("image");
 Bitmap image = BitmapFactory.decodeByteArray(byteArray, 0, 
 byteArray.length);
 selectedItem.setPhoto(image);
Pavel Aslanov
fonte
2

A exceção ocorreu devido ao fato de que qualquer uma das classes internas ou outras classes referenciadas não implementou a implementação serializável. Portanto, verifique se todas as classes referenciadas devem implementar a implementação serializável.

Sridhar Shanmugam
fonte
0

Também estou fase desses erros e estou com uma pequena alteração no modelClass, que são implementadas na interface serializável, como:

Nessa classe Model também implementa a interface Parcelable com o método de substituição writeToParcel ()

Então, obtive o erro "criar criador", para que o CREATOR seja gravado e também crie com o modelclass contructor com argumentos e sem argumentos ..

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

Aqui,

ArtistTrackClass -> ModelClass

O construtor com argumentos Parcel "lê nossos atributos" e writeToParcel () é "escreve nossos atributos"

Dhruv Raval
fonte
0

a classe Grade também deve implementar Serializable

public class Grade implements Serializable {
.....your content....
}
yOshi
fonte
0

É necessário alterar todo o arraylist para wif serializável na classe de 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;
        }
    }
 }
murugan mani
fonte
0

Eu enfrentei o mesmo problema, os problemas eram que existem algumas classes internas com a palavra-chave estática.Depois de remover a palavra-chave estática, ela começou a funcionar e também a classe interna deve ser implementada como Serializable

Cenário de problema

class A implements Serializable{ 
  class static B{
  } 
}

Resolvido por

class A implements Serializable{ 
      class B implements Serializable{
      } 
    }
sunil KV
fonte
0

No meu caso eu tive que implementar MainActivitycomo Serializabletambém. Porque eu precisava iniciar um serviço do meu 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);
}
Brigante
fonte