Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法序列化对象并在Android中获取它_Android_Fileoutputstream - Fatal编程技术网

无法序列化对象并在Android中获取它

无法序列化对象并在Android中获取它,android,fileoutputstream,Android,Fileoutputstream,我正在尝试serlize一个Enum类,这样我可以在onCreate方法中恢复,这样每次运行我都有一个更新的类 下面是用于序列化和反序列化类的代码: private void serializeModulesManager() { try { FileOutputStream fos = openFileOutput("modules.ser", Context.MODE_PRIVATE); ObjectOutputStre

我正在尝试serlize一个Enum类,这样我可以在onCreate方法中恢复,这样每次运行我都有一个更新的类

下面是用于序列化和反序列化类的代码:

private void serializeModulesManager() {
    try {
        FileOutputStream fos = openFileOutput("modules.ser",
                Context.MODE_PRIVATE);
        ObjectOutputStream out = new ObjectOutputStream(fos);
        out.writeObject(Module.values());
        out.close();
        fos.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

private void restoreModulesManager() {
    FileInputStream fileIn;
    Module[] arr = null;
    try {

        fileIn = openFileInput("modules.ser");
        ObjectInputStream in = new ObjectInputStream(fileIn);
        arr = (Module[]) in.readObject();

        for (Module c : arr) {
            Module.valueOf(c.name()).serilize(c);
        }

        in.close();
        fileIn.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (StreamCorruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
我在onDestroy中调用SerializedModulesManager,在onCreate中调用restoreModulesManager

问题是,当我从任务管理器强制关闭时,ObjectInputStream无法读取对象,我得到一个EOFEException


我如何解决这个问题?

以下是我将如何处理这个问题。这是一个只有标题字段的简单对象,但对于更复杂的对象,可以使用相同的方法

public class MyObject implements Parcelable{

public String title;


public MyObject(){}


public MyObject(Parcel source){
    title = source.readString();

}


public void setTitle(String title){
    this.title = title;
}

public String getTitle(){
    return this.title;
}

    // Parcel Overrides
@Override
public int describeContents(){return 0;}

@Override
public void writeToParcel(Parcel dest, int flags){

    dest.writeString(title);
}

// Parcelable Creator

public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>(){
    @Override
    public MyObject createFromParcel(Parcel source){
        return new MyObject(source);

    }

    @Override
    public MyObject [] newArray(int size){
        return new MyObject[size];
    }   
}
}
然后使用OnCreate或您用来恢复UI的任何方法

 // Add this

 myObjects = (MyObject [])savedInstanceState.getParcelableArray("MyObjectArray");

你需要用一个文件吗?我知道,如果进入模块对象类并添加implements Parcelable,则可以使用Parcelable对象保存数据,并使用Parcelable CREATOR恢复数据。只需使用savedState捆绑包将模块[]存储为Parcelablar。按照这种方式,您应该使用while循环而不是for循环,并说whilein.isAvailable>0{arr=Module[]in.readObject;}
 // Add this

 myObjects = (MyObject [])savedInstanceState.getParcelableArray("MyObjectArray");