课程咨询 :18820797144

广州C++培训 > 达内新闻 > 序列化的基本用法
  • 序列化的基本用法

    发布:广州C++培训      来源:达内新闻      时间:2017-01-10

  • 广州C++培训的小编这一期给大家讲序列化的基本用法。

    Serializable

    要让一个类支持序列化,只需要让这个类实现接口java.io.Serializable,Serializable没有定义任何方法,只是一个标记接口。比如,对于57节提到的Student类,为支持序列化,可改为:

    public class Student implements Serializable {

    String name;

    int age;

    double score;

    public Student(String name, int age, double score) {

    ...

    }

    ...

    }

    声明实现了Serializable接口后,保存/读取Student对象就可以使用另两个流了ObjectOutputStream/ObjectInputStream。

    ObjectOutputStream/ObjectInputStream

    ObjectOutputStream是OutputStream的子类,但实现了ObjectOutput接口,ObjectOutput是DataOutput的子接口,增加了一个方法:

    public void writeObject(Object obj) throws IOException

    这个方法能够将对象obj转化为字节,写到流中。

    ObjectInputStream是InputStream的子类,它实现了ObjectInput接口,ObjectInput是DataInput的子接口,增加了一个方法:

    public Object readObject() throws ClassNotFoundException, IOException

    这个方法能够从流中读取字节,转化为一个对象。

    使用这两个流,57节介绍的保存学生列表的代码就可以变为:

    public static void writeStudents(List<Student> students) throws IOException {

    ObjectOutputStream out = new ObjectOutputStream(

    new BufferedOutputStream(new FileOutputStream("students.dat")));

    try {

    out.writeInt(students.size());

    for (Student s : students) {

    out.writeObject(s);

    }

    } finally {

    out.close();

    }

    }

    而从文件中读入学生列表的代码可以变为:

    public static List<Student> readStudents() throws IOException,

    ClassNotFoundException {

    ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(

    new FileInputStream("students.dat")));

    try {

    int size = in.readInt();

    List<Student> list = new ArrayList<>(size);

    for (int i = 0; i < size; i++) {

    list.add((Student) in.readObject());

    }

    return list;

    } finally {

    in.close();

    }

    }

    实际上,只要List对象也实现了Serializable (ArrayList/LinkedList都实现了),上面代码还可以进一步简化,读写只需要一行代码,如下所示:

    public static void writeStudents(List<Student> students) throws IOException {

    ObjectOutputStream out = new ObjectOutputStream(

    new BufferedOutputStream(new FileOutputStream("students.dat")));

    try {

    out.writeObject(students);

    } finally {

    out.close();

    }

    }

    public static List<Student> readStudents() throws IOException,

    ClassNotFoundException {

    ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(

    new FileInputStream("students.dat")));

    try {

    return (List<Student>) in.readObject();

    } finally {

    in.close();

    }

    }

    是不是很神奇?只要将类声明实现Serializable接口,然后就可以使用ObjectOutputStream/ObjectInputStream直接读写对象了。我们之前介绍的各种类,如String, Date, Double, ArrayList, LinkedList, HashMap, TreeMap等,都实现了Serializable。

    广州C++培训的小编在下一期还会继续给大家讲新的资讯。

    推荐文章

上一篇:Hibernate的属性的解析

下一篇:序列化的复杂对象

最新开班日期  |  更多

c++--高薪就业班

c++--高薪就业班

开班日期:5月31日

c++--免费训练营

c++--免费训练营

开班日期:5月31日

c++--零基础全日制班

c++--零基础全日制班

开班日期:5月31日

c++--零基础周末班

c++--零基础周末班

开班日期:5月31日

  • 网址:http://gz.c.tedu.cn     地址:广州市天河北五山路 141 号尚德大厦 627
  • 课程培训电话:18820797144     全国服务监督电话:400-111-8989
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56