MyException - 我的异常网
当前位置:我的异常网» J2SE » 关于ObjectInputStream读写,该怎么解决

关于ObjectInputStream读写,该怎么解决

www.MyException.Cn  网友分享于:2013-02-07  浏览:35次
关于ObjectInputStream读写
想把自定义类的实例写进对象文件,打算用ObjectInputStream
一般情况下都能读写,但,问题来了,当我自定义类的数据域里面包含了对象数组,或ArrayList类之类的数组对象之后,读出会出错。这里贴出一些代码(思路简单,但可能被我写得繁琐):
Java code

public class classes implements Serializable {

    private int grade;
    private String major;
    private int classnum;
    private ArrayList stulist;       //去掉之后读写无误,此容器用作存放students类

    public classes(int grade, String major, int classnum) {
        this.grade = grade;
        this.major = major;
        this.classnum = classnum;
        this.stulist = new ArrayList();       //去掉之后读写无误
    }

    public void addstudent(students a){
         this.stulist.add(a);                //添加学生
    }

    public void savaclass() {          //写入函数,无错误提示
        try {
            File classFile = new File("D:/TestData/Classes");
            
            FileOutputStream classdata = new FileOutputStream("D:/TestData/Classes/" + classnum + ".dat");
            ObjectOutputStream out = new ObjectOutputStream(classdata);
            out.writeObject(this);
            classdata.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public classes loadclass(int classnum) {
        classes a = new classes();
        try {
            FileInputStream classdata = new FileInputStream("D:/TestData/Classes/" + classnum + ".dat");
            ObjectInputStream in = new ObjectInputStream(classdata);
            if (a instanceof classes) {
                a = (classes) in.readObject();   //但classes不含对象数组或Arraylist时读写无误
                                                 //否则会抛出异常local class incompatible
            } else {
                System.out.print("Exception");
            }
            classdata.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return a;
    }

     public void static main(String[] args){
         classes a = new classes(2009,"softwareE",5);//产生一个不含学生的班级类
         a.addstudent(new students(10,"Tim",5));
         a.savaclass();
         classes c = new classes();//无参构造函数默认存在,且会对数组初始化,这里没贴上
         c = a.loadclass(5);      //classes含对象数组时出错,否则正常读出
}


class students implements Serializable {

    private String name;
    private int stunumber;
    private int classnum;

    public students(int stunumber, String name, int classnum) {
        this.name = name;
        this.stunumber = stunumber;
        this.classnum = classnum;
    }
}



我想将整个班级的信息写到一个对象文件了,因此必须借助数组,请问为什么当classes类数据域存在数组时读写失败呢?如何解决?有其他解决办法吗?在线等,谢谢!

------解决方案--------------------
你写的代码严重不符合Java命名规范,改了相当一部分,现在能跑起来了,你用ObjectStream的代码有些根本是多此一举,还有一个instanceof太蛋疼了,贴出代码你对比着看着吧
Java code

import java.util.ArrayList;
import java.io.*;

public class Classes implements Serializable {

    private int grade;
    private String major;

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }

    public int getClassnum() {
        return classnum;
    }

    public void setClassnum(int classnum) {
        this.classnum = classnum;
    }

    public ArrayList<Student> getStulist() {
        return stulist;
    }

    public void setStulist(ArrayList<Student> stulist) {
        this.stulist = stulist;
    }

    private int classnum;
    private ArrayList<Student> stulist;       //去掉之后读写无误,此容器用作存放students类

    public Classes(int grade, String major, int classnum) {
        this.grade = grade;
        this.major = major;
        this.classnum = classnum;
        this.stulist = new ArrayList();       //去掉之后读写无误
    }

    public void addStudent(Student a){
         this.stulist.add(a);                //添加学生
    }

    public void savaClass() {          //写入函数,无错误提示
        try {
//            File classFile = new File("D:/TestData/Classes");

            FileOutputStream classdata = new FileOutputStream("D:/TestData/Classes/" + classnum + ".dat");
            ObjectOutputStream out = new ObjectOutputStream(classdata);
            out.writeObject(this);
            classdata.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public Classes loadClass(int classnum) {
        Classes a = null;
        try {
            FileInputStream classdata = new FileInputStream("D:/TestData/Classes/" + classnum + ".dat");
            ObjectInputStream in = new ObjectInputStream(classdata);

            a = (Classes) in.readObject();   // 一切正常


            classdata.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return a;
    }

     public static void main(String[] args){
         Classes a = new Classes(2009,"softwareE",5);//产生一个不含学生的班级类
         a.addStudent(new Student(10,"Tim",5));
         a.savaClass();
         Classes c = a.loadClass(5);//无参构造函数默认存在,且会对数组初始化,这里没贴上
         System.out.println(c.getClassnum());
         System.out.println(c.getGrade());
         System.out.println(c.getMajor());
         ArrayList<Student> stus=c.getStulist();
         for(Student s:stus){
             System.out.println(s);
         }
               //classes含对象数组时出错,否则正常读出
}

}
class Student implements Serializable {

    private String name;
    private int stuNumber;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getStuNumber() {
        return stuNumber;
    }

    public void setStuNumber(int stuNumber) {
        this.stuNumber = stuNumber;
    }

    public int getClassNum() {
        return classNum;
    }

    public void setClassNum(int classNum) {
        this.classNum = classNum;
    }

    private int classNum;

    public Student(int stuNumber, String name, int classNum) {
        this.name = name;
        this.stuNumber = stuNumber;
        this.classNum = classNum;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", stuNumber=" + stuNumber +
                ", classNum=" + classNum +
                '}';
    }
}

文章评论

60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
鲜为人知的编程真相
鲜为人知的编程真相
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
总结2014中国互联网十大段子
总结2014中国互联网十大段子
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
如何成为一名黑客
如何成为一名黑客
我的丈夫是个程序员
我的丈夫是个程序员
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员必看的十大电影
程序员必看的十大电影
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
代码女神横空出世
代码女神横空出世
程序员的鄙视链
程序员的鄙视链
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
中美印日四国程序员比较
中美印日四国程序员比较
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
10个调试和排错的小建议
10个调试和排错的小建议
那些争议最大的编程观点
那些争议最大的编程观点
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员和编码员之间的区别
程序员和编码员之间的区别
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
编程语言是女人
编程语言是女人
 程序员的样子
程序员的样子
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
每天工作4小时的程序员
每天工作4小时的程序员
为什么程序员都是夜猫子
为什么程序员都是夜猫子
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
我是如何打败拖延症的
我是如何打败拖延症的
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
旅行,写作,编程
旅行,写作,编程
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
一个程序员的时间管理
一个程序员的时间管理
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
Java程序员必看电影
Java程序员必看电影
老程序员的下场
老程序员的下场
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有