之前在ArrayList章节提到,ArrayList实现了Serializable接口,是可以被序列化的。当时并没有明白是什么意思。本文用来简单了解序列化的含义,并举实例。
Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。整个过程都是 Java 虚拟机独立的,即,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。
如果你想对某一可序列化的对象进行序列化和反序列化,可以使用ObjectInputStream 和ObjectOutputStream两个类。
其中的ReadObject() 和WriteObject()方法
public final void writeObject(Object obj) throws IOException
上面方法可以对某一对象进行序列化,并放到输入流中。
public final Object readObject()
throws IOException, ClassNotFoundException
相应的,上面方法是将某一对象从流中取出,并进行反序列化。
接下来我们看个实例:
新建一个Student类,并实现Serializable接口
public class Student implements Serializable {
String name;
int age;
public Student(String name,int age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
//重写tostring方法,便于我们直观的看结果
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void setAge(int age) {
this.age = age;
}
}
现在我们建一个文件流,并把student对象写入到里面:
File file=new File("D:"+ File.separator+"test.txt");
FileOutputStream fileOutputStream=new FileOutputStream(file);
ObjectOutputStream objectOutputStream=new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(new Student("tom",11));
运行之后我们看到D盘下test.txt文件里是这些东西:
sr boke.Serializable.Studentx揼
椸焠 I ageL namet Ljava/lang/String;xp t tom
我们看不懂,但是无所谓,因为我们大体知道student对象确实被写入到文件流中了,我们可以用输入流查看一下
InputStream fileInputStream=new FileInputStream(file);
ObjectInputStream objectInputStream=new ObjectInputStream(fileInputStream);
System.out.println(objectInputStream.readObject().toString());
运行结果:
Student{name='tom', age=11}
文件里放的确实是student对象。既然我们知道这是一个student对象,我们就可以这样:
Student student=null;
InputStream fileInputStream=new FileInputStream(file);
ObjectInputStream objectInputStream=new ObjectInputStream(fileInputStream);
//因为readObject返回一个Object对象,所以要强转。
student= (Student) objectInputStream.readObject();
//随便调用一些类中的方法;
System.out.println(student.getName()+"---"+student.getAge());
输出:
tom---11
总之,序列化是将对象状态转换为可保持或传输的格式的过程。假设我们不实现此接口,则会这样:
Exception in thread "main" java.io.NotSerializableException: boke.Serializable.Student
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
所以记得,想要对象在流中来去自如,实现Serializable接口,你并不需要做其他任何事(实现方法),只需要实现这个接口就够了。