对象序列化的用处:假设我们现在有个Student类,里面有属性:姓名、语文、英语和数学的成绩的数据,当需要把这个对象中的数据保存下来,你该怎么办?最容易想到的一种方法是把对象中的各个属性分别调用writeXX方法输出给指定的文件,这个方法虽然可行,但对于拥有大量属性的对象就显得不是很方便了,页容易出错。 这个时候就会使用到对象的序列化,用流方式处理对象,就不必在考虑细节问题。下面是网上看到的关于序列化的解析,很详细、很容易理解。
我们都知道,当我们new一个对象的时候,Java就会在内存中创建一个相应的对象供我们后续使用。如果我们把这个Java程序关掉的话,那么这个对象也就随着我们程序的关闭而消失,如何才能在这种情况下继续保存这个对象呢?这就是Java序列化要做的事情。简单地说,Java对象列化就是要把内存中的Java对象保存下来(持久化),以便可以在网络上传输或今后继续使用这个对象中的数据。
那么对象序列化到底做了哪些事呢?其实很简单,一个对象对于我们来说的意义其实就是对象里保存的那些数据,序列化就是把这些数据转换成二进制表示的对象流,你可以把它通过网络传输到远程,当然,也可以把这些信息保存在本地的文件里。下面给出一个最简单的Java的序列化与反序列化的例子,看懂这个例子,相信你应该也能跟我一样,大概理解这是怎么一回事了。
首先是一个Peraon类:
Person.java
- package com.lanber.serial;
- import java.io.Serializable;
- public class Person implements Serializable {
- private String name;
- private int age;
- private String sex;
- private String nationality;
- public Person(String _name, int _age, String _sex, String _nationality) {
- this.name = _name;
- this.age = _age;
- this.sex = _sex;
- this.nationality = _nationality;
- }
- public String toString() {
- return "Name:" + name + "\nAge:" + age + "\nSex:" + sex
- + "\nNationality:" + nationality + "\n\n";
- }
- }
而后我们要实例化一个Person对象,把我们实例化出来的这个对象序列化,并把序列化后的对象流保存到文件中去:
WritePerson.java
- package com.lanber.serial;
- import java.io.*;
- public class WritePerson {
- public static void main(String[] args) {
- try {
- ObjectOutputStream oos = new ObjectOutputStream(
- new FileOutputStream("Person.tmp"));
- Person obj = new Person("Tony", 25, "Female", "han");
- System.out.println("将Person对象写入到文件Person.tmp中...");
- oos.writeObject(obj);
- oos.close();
- System.out.println("完成!");
- } catch (Exception e) {
- System.out.println(e);
- }
- }
- }
这样,我们就把序列化后的二进制对象流保存到Person.tmp的文件中去了(特别要注意这里的oos.writeObject()方法,这个方法就是实现把obj对象序列化的方法)。你可以打开生成的这个文件查看,不过我们是看不懂这里面的信息的,因为这是二进制数据啊。
那我们要怎么才能看懂这些二进制数据呢?这就要用到我们的反序列化了。反序列化就是要把序列化后的二进制数据反向解析成可以正常使用的Java对象。现在让我们来把刚才的那个对象反序列化一下吧:
ReadPerson.java
- package com.lanber.serial;
- import java.io.*;
- public class ReadPerson {
- public static void main(String[] args) {
- Person obj = null;
- try {
- ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
- "Person.tmp"));
- obj = (Person) ois.readObject();
- System.out.println(obj);
- ois.close();
- } catch (Exception e) {
- System.out.println(e);
- }
- }
- }