广州C/C++培训
达内广州岗顶中心

18087159764

热门课程

序列化的基本用法

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

广州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的属性的解析
下一篇:序列化的复杂对象

华硕ZenBook/VivoBook全面更新

中国工程师破解苹果iOS11.2支持7.5W无线快充

HTC推出VR一体机:骁龙835+AMOLED屏

REM响应式编程是个什么鬼?

选择城市和中心
贵州省

广西省

海南省