Class 反序列化对象时抛出异常

Class Cast Exception when DeSerializing an Object

概览

我是 Android 开发的新手,我正在尝试序列化然后反序列化一个对象的值,但出现异常。

异常

致命异常:main

java.lang.ClassCastException: java.io.File 无法转换为 com.testingapplication.SchoolNameDetails com.testingapplication.fragment.HomeFragment$1.onClick(HomeFragment.java:62)

我试过的

学校名称详情class如下:

public class SchoolNameDetails implements Serializable {
private int id;
private String schoolname;
private String level;
private String pkno;
private String nano;
private String ucname;
private String officeno;
private static final long serialVersionUID = 46548923;

public SchoolNameDetails(){}

public SchoolNameDetails(String schoolname, String level, String pkno,String nano, String ucname, String officeno){
    this.schoolname=schoolname;
    this.level=level;
    this.pkno=pkno;
    this.nano=nano;
    this.ucname=ucname;
    this.officeno=officeno;
}

public SchoolNameDetails(int id, String schoolname, String level, String pkno,String nano, String ucname, String officeno){
    this.id=id;
    this.schoolname=schoolname;
    this.level=level;
    this.pkno=pkno;
    this.nano=nano;
    this.ucname=ucname;
    this.officeno=officeno;
}

public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getSchoolname() {
    return schoolname;
}
public void setSchoolname(String schoolname) {
    this.schoolname = schoolname;
}
public String getLevel() {
    return level;
}
public void setLevel(String level) {
    this.level = level;
}
public String getPkno() {
    return pkno;
}
public void setPkno(String pkno) {
    this.pkno = pkno;
}
public String getNano() {
    return nano;
}
public void setNano(String nano) {
    this.nano = nano;
}
public String getUcname() {
    return ucname;
}
public void setUcname(String ucname) {
    this.ucname = ucname;
}
public String getOfficeno() {
    return officeno;
}
public void setOfficeno(String officeno) {
    this.officeno = officeno;
}

}

我在这里序列化对象

@Override
protected void onStop() {
    super.onStop();
    SchoolNameDetails details = new SchoolNameDetails();
    details.setSchoolname(t2.getText().toString());
    details.setLevel(t2a.getText().toString());
    details.setPkno(t5.getText().toString());
    details.setNano(t6.getText().toString());
    details.setUcname(t7.getText().toString());
    details.setOfficeno(t8.getText().toString());

    saveObject(details);

}

public void saveObject(SchoolNameDetails d) {
    try
    {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("/sdcard/save_object.ser")));
        oos.flush();
        oos.close();
    }
    catch(Exception ex)
    {
        Log.v("Error",ex.getMessage());
        ex.printStackTrace();
    }

}

并且我在这里反序列化我的片段中的对象 class

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_home,
            container, false);
    Button b1= (Button) view.findViewById(R.id.button1);
    final TextView t1 = (TextView) view.findViewById(R.id.textView1);
    b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            SchoolNameDetails details = (SchoolNameDetails)loadSerializedObject(new File("/sdcard/save_object.ser"));
            System.out.println("Name : " + details.getSchoolname());
        }


    });

    return view;
}
public Object loadSerializedObject(File f)
{
    try
    {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
        Object o = ois.readObject();

    }
    catch(Exception ex)
    {
        Log.v("Error : ","" + ex.getMessage());
        ex.printStackTrace();
    }
    return f;
}

现在最后一个 return 值给出异常。我尝试使用 return null 但随后它给出了空指针异常。请帮助我被困 数小时并且没有找到任何解决方案

首先改变你的saveObject方法来实际写入对象:

public void saveObject(SchoolNameDetails d) {
    try
    {
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("/sdcard/save_object.ser")));
        //write to ObjectOutputStream
        oos.writeObject(d);
        oos.flush();
        oos.close();
    }
    catch(Exception ex)
    {
        Log.v("Error",ex.getMessage());
        ex.printStackTrace();
    }
}

接下来将您的 loadSerializedObject 方法更改为 return 来自输入流的对象:

public SchoolNameDetails loadSerializedObject(File f)
{
    try
    {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
        SchoolNameDetails o = (SchoolNameDetails ) ois.readObject();
        return o;
    }
    catch(Exception ex)
    {
        Log.v("Error : ","" + ex.getMessage());
        ex.printStackTrace();
    }
    return null;
}

最后在你的 onClick 中确保对象不为空:

    @Override
    public void onClick(View view) {
        SchoolNameDetails details = loadSerializedObject(new File("/sdcard/save_object.ser"));
        if (details != null) {
            System.out.println("Name : " + details.getSchoolname());
        }
    }

您在函数末尾 returning f。但是你必须 return o(你从方法 ois.readObject() 中得到的。